Подтвердить что ты не робот

Статус доставки Swift Mailer

Кто-нибудь знает, возвращает ли функция отправки SwiftMailer статус доставки? Я хотел бы знать, что письмо было доставлено или не доставлено. Возможно ли это?

Спасибо

4b9b3361

Ответ 1

Существует не менее трех уровней проверок, поддерживаемых SwiftMailer, которые сообщают о нескольких типах сбоев доставки.

1) Всегда проверяйте код возврата из команд SwiftMailer send() или batchSend() для ненулевого результата. Из документации:

//Send the message
$numSent = $mailer->send($message);

printf("Sent %d messages\n", $numSent);

/* Note that often that only the boolean equivalent of the
   return value is of concern (zero indicates FALSE)

if ($mailer->send($message))
{
  echo "Sent\n";
}
else
{
  echo "Failed\n";
}

2) Используйте функцию отказов по ссылке, чтобы узнать, были ли отклонены или не были удалены определенные адреса:

//Pass a variable name to the send() method
if (!$mailer->send($message, $failures))
{
  echo "Failures:";
  print_r($failures);
}

/*
Failures:
Array (
  0 => [email protected],
  1 => [email protected]
)
*/

3) В некоторых ситуациях вы можете захотеть включить возвратные квитанции, которые подтверждают, что сообщение электронной почты отображало сообщение. Они часто отключены или игнорируются пользователями или их приложениями электронной почты, но если вы получаете квитанцию, она является очень подтверждением. Также обратите внимание, что это может произойти через несколько дней после отправки, поэтому это не синхронный тест в режиме реального времени, как два выше.

$message->setReadReceiptTo('[email protected]');

Однако, поскольку в SMTP-доставке так много переменных и уровней систем, как правило, не может быть абсолютно уверены, что сообщения были доставлены. Лучшее, что вы можете сделать, это убедиться, что вы используете первые две проверки выше. Если вы используете свой собственный сервер для службы SMTP, вам также нужно следить за вашими журналами и очередями, о которых говорил Marc B.

Еще один пример, который подчеркивает необходимость познакомиться с любой базовой системой электронной почты, которую вы используете. Я только начал использовать Swift_AWSTransport от Джона Хоббса для SES Amazon Web Services. SES имеет возможность возвращать ответ XML с диагностической информацией для каждого отправленного через него сообщения. Хотя SwiftMailer по сути не понимает, как использовать этот ответ XML, я нашел его неоценимым для устранения неполадок доставки. Я упоминаю об этом, потому что обнаружил, что в некоторых случаях проверки # 1 и # 2 выше будут успешными для SwiftMailer, но SES не понравилось что-то в моем форматировании сообщений. Поэтому я рассматриваю анализ XML как дополнительную проверку.

Ответ 2

Довольно старый пост, но с Swiftmailer 4+ и кроме получения статуса result от вызова метода send. Если вы хотите отладить свою почтовую программу и посмотреть, что происходит во время транспортировки, вы можете использовать плагины Logger или даже создать свой собственный плагин. https://swiftmailer.symfony.com/docs/plugins.html

$mailer = \Swift_Mailer::newInstance(
    \Swift_SmtpTransport::newInstance('tls://smtp.gmail.com', 465)
);
$logger = new \Swift_Plugins_Loggers_ArrayLogger;
//$logger = new \Swift_Plugins_Loggers_EchoLogger; //echo messages in real-time
$mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));

foreach ($recipients as $recipient) {
    //...

    $mailer->send(/*...*/);
}

echo $logger->dump(); //not needed if using EchoLogger plugin

Который будет выводить транспортное сообщение для каждого send вызова, который выглядит как

++ Starting Swift_SmtpTransport 
<< 220 smtp.gmail.com ESMTP x12sm4143221vkc.19 - gsmtp 
>> EHLO server.example.com 
<< 250-smtp.gmail.com at your service, [192.168.1.1] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-CHUNKING 250 SMTPUTF8 
>> AUTH LOGIN 
<< 334 AbcDefGhIjKlMnop 
>> AbcDefGhIjKlMnop== 
<< 334 AbcDefGhIjKlMnop 
>> AbcDefGhIjKlMnop== 
<< 235 2.7.0 Accepted 
++ Swift_SmtpTransport started 
>> MAIL FROM: 
<< 250 2.1.0 OK x12sm4143221vkc.19 - gsmtp 
>> RCPT TO:<[email protected]> 
<< 250 2.1.5 OK x12sm4143221vkc.19 - gsmtp 
>> DATA 
<< 354 Go ahead x12sm4143221vkc.19 - gsmtp 
>> . 
<< 250 2.0.0 OK 1468948643 x12sm4143221vkc.19 - gsmtp

Ответ 3

Swiftmailer не имеет ничего общего с фактической доставкой почты. Он просто передает все на любой SMTP-сервер, который вы указали, и это тот сервер, который заботится о доставке. Вам нужно проверить журналы SMTP-сервера, чтобы узнать, что произошло с почтой. Он может застрять в исходящей очереди, потому что сервер захламлен. Он может застревать в очереди, потому что принимающая сторона недоступна или использует серо-листинг и т.д. Задача Swiftmailer заканчивается после получения подтверждения с сервера SMTP, что почта была поставлена ​​в очередь.