Swift Mailer交付状态

Dav*_*idW 29 php symfony1 swiftmailer symfony-1.4

有谁知道SwiftMailer发送函数是否返回传递状态?我希望能够知道电子邮件已发送或未发送.这可能吗?

谢谢

ybu*_*ull 38

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";
}
Run Code Online (Sandbox Code Playgroud)

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
)
*/
Run Code Online (Sandbox Code Playgroud)

3)在某些情况下,您可能还想启用退货收据,这确认电子邮件阅读器显示了该消息.他们经常被用户或他们的电子邮件应用程序禁用或忽略,但如果您收到收据,则会非常确认.另请注意,这可能会在发送后多天发生,因此它不是像上面两个那样的实时同步测试.

$message->setReadReceiptTo('your@address.tld');
Run Code Online (Sandbox Code Playgroud)

但是,由于SMTP传递中涉及的系统变量和层数很多,因此通常无法确保传递消息.您可以做的最好的事情是确保您使用上面的前两个检查.如果您使用自己的服务器进行SMTP服务,那么您还需要像Marc B所提到的那样关注您的日志和队列.

另一个例子强调需要熟悉您正在使用的任何底层电子邮件系统.我刚刚开始使用John Hobbs为亚马逊网络服务SES提供的Swift_AWSTransport.SES能够返回XML响应,其中包含通过它发送的每条消息的诊断信息.尽管SwiftMailer本身并不了解如何使用该XML响应,但我发现它对于交付故障排除非常宝贵.我之所以提到它,是因为我发现在某些情况下,上面的#1和#2检查对SwiftMailer来说似乎是成功的,但是SES不喜欢我的消息格式化.因此,我正在考虑将该XML解析为附加检查.


fyr*_*rye 8

相当古老的帖子,但是从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
Run Code Online (Sandbox Code Playgroud)

这将为每个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
Run Code Online (Sandbox Code Playgroud)


Mar*_*c B 6

Swiftmailer与邮件的实际传递无关。它只是将内容移交给您指定的任何SMTP服务器,而该服务器负责交付。您需要检查SMTP服务器的日志以查看邮件发生了什么。由于服务器被淹没,它可能会卡在传出队列中。由于接收端无法访问或正在使用灰名单等原因,它可能会卡在队列中。一旦从SMTP服务器确认邮件已排队,Swiftmailer的工作就会结束。

  • 它仍然没有说为什么失败。它无法到达服务器吗?授权被拒绝了吗?是否需要SSL / TLS但未使用SSL / TLS?等等... (2认同)