Php 如何使用swiftmailer获取电子邮件队列ID?
当我使用telnet smtp发送电子邮件时,服务器会在发送电子邮件时回答我Php 如何使用swiftmailer获取电子邮件队列ID?,php,swiftmailer,Php,Swiftmailer,当我使用telnet smtp发送电子邮件时,服务器会在发送电子邮件时回答我250 2.0.0确定:排队为7A821440123E。所以我需要获得ID7A821440123E来跟踪邮件日志中的电子邮件。 是否可以通过Swiftmailer实现这一点?Swiftmailer基于事件,因此其他开发人员可以轻松地对其进行扩展。每次调用Swift\u Transport上的send方法时,都会发送相应的事件。您可以使用已经开发的监听器(插件),也可以编写自己的监听器(插件),这将更加定制 现有插件 Sw
250 2.0.0确定:排队为7A821440123E
。所以我需要获得ID7A821440123E
来跟踪邮件日志中的电子邮件。
是否可以通过Swiftmailer实现这一点?Swiftmailer基于事件,因此其他开发人员可以轻松地对其进行扩展。每次调用
Swift\u Transport
上的send
方法时,都会发送相应的事件。您可以使用已经开发的监听器(插件),也可以编写自己的监听器(插件),这将更加定制
现有插件
SwiftMailer已经提供了一些可以用来解决问题的工具
只需使用。它将记录Swift\u Transport
实现中的所有命令调用
例子
输出
然后在mailer实例中注册你的插件
$mailer->registerPlugin(new FindEmailIdResponse());
根据协议,不需要第三方插件来获取Message-ID。
邮件ID由SwiftMailer设置,否则SMTP服务器将自己创建一个。
因此,您只需要:
$message = \Swift_Message::newInstance($subject, $body);
...
$messageID = $message->getId();
换句话说,Swift Mailer似乎没有提供现成的信息,您需要自己从服务器响应中解析它。虽然库必须进行一些基本的解析,但它只对250状态代码感兴趣。太糟糕了,你不能直接访问确切的日志行。但它不是相同的ID,是吗?如果你检查源代码,你会看到Swift生成的ID以“@something”(例如“@Swift.generated”或“@example.com”)结尾,但每次我检查SMTP日志时,我都会发现简单的十六进制字符串,如问题中所示。(还有两个已删除的答案,它们的状态与您相同,当您有足够的代表时,您可以看到它们。)我正在使用mailcatcher作为虚拟SMTP服务器来测试我的邮件服务,并且我可以确认SwiftMailer生成的ID是mailcatcher SMTP报告的ID。我将尝试用现实世界的SMTP重现您所说的。我最近与两三家提供商合作,没有一家会使用Swift生成的ID。此外,几年前我曾维护一台Postfix服务器,它大量使用十六进制队列ID:您可以使用ID跟踪、重新发送、删除。。。使用postqueue命令,并且在该上下文中,ID需要是唯一的。10年后我不能确定,但我怀疑身份证就是被报告的那个。无论如何,为了得到一个明确的答案,我们需要深入研究SMTP RFC,看看他们对队列ID说了什么(或没有说什么)。你说的是一个不同于OP的ID!OP要求的是队列ID,通常看起来像7A821440123E。您所说的是消息ID(即电子邮件中的标题),通常看起来像电子邮件地址,例如
class FindEmailIdResponse implements Swift_Events_ResponseListener
{
/**
* {@inheritdoc}
*/
public function responseReceived(Swift_Events_ResponseEvent $evt)
{
if (strpos($evt->getResponse(), 'queued') !== false) {
// do whatever you want with the response or event
}
}
}
$mailer->registerPlugin(new FindEmailIdResponse());
$message = \Swift_Message::newInstance($subject, $body);
...
$messageID = $message->getId();