Статус доставки почтовой программы Swift


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

Спасибо

Author: DavidW, 2011-04-24

3 answers

Существует по крайней мере три уровня проверок, которые поддерживает 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, то вам ТАКЖЕ необходимо следить за своими журналами и очередями, как упоминал Марк Б.

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

 36
Author: ybull, 2015-12-18 19:29:28

Довольно старая запись, но начиная с Swiftmailer 4+ и помимо получения статуса result из вызова метода send. Если вы хотите отладить свою почтовую программу и посмотреть, что происходит во время транспортировки, вы можете использовать плагины регистратора или даже создать свой собственный плагин. 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));

for ($lotsOfRecipients 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
 5
Author: fyrye, 2018-05-16 20:58:48

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

 4
Author: Marc B, 2011-04-24 03:11:20