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

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

25 голосов
/ 24 апреля 2011

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

Спасибо

Ответы [ 3 ]

37 голосов
/ 28 апреля 2011

Существует как минимум три уровня проверок, которые поддерживает 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 => receiver@bad-domain.org,
  1 => other-receiver@bad-domain.org
)
*/

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

$message->setReadReceiptTo('your@address.tld');

Однако, поскольку в доставке SMTP задействовано так много переменных и уровней систем,Как правило, невозможно быть абсолютно уверенным, что сообщения были доставлены.Лучшее, что вы можете сделать, это убедиться, что вы используете первые две проверки выше.Если вы используете СВОЙ собственный сервер для службы SMTP, то вы также должны следить за своими журналами и очередями, как упомянул Марк Б.

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

6 голосов
/ 19 июля 2016

Довольно старый пост, но начиная с 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:<recipient@example.com> 
<< 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 голосов
/ 24 апреля 2011

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

...