如何使用swiftmailer获取电子邮件队列ID


How to get Email Queue ID with swiftmailer?

当我使用 telnet SMTP 发送电子邮件时,发送电子邮件时250 2.0.0 Ok: queued as 7A821440123E服务器会回答我。所以我需要获取ID 7A821440123E来跟踪邮件日志中的电子邮件。是否有可能用Swiftmailer获得这个?

SwiftMailer 是基于事件的,因此其他开发人员可以轻松扩展它。每次调用 Swift_Transport 上的 send 方法时,都会调度正确的事件。您可以使用已经开发的侦听器(插件),也可以编写自己的侦听器,这将更加自定义。

现有插件

SwiftMailer已经推出了一些插件,您可以使用它们来解决问题。

只需使用记录器插件。它将记录实现Swift_Transport中的所有命令调用。

$transport = Swift_SmtpTransport::newInstance('example.com', 25);
$mailer = Swift_Mailer::newInstance($transport);
$mailer->registerPlugin(
    new Swift_Plugins_LoggerPlugin(
        new Swift_Plugins_Loggers_EchoLogger(false)
    )
);
$message = Swift_Message::newInstance('Wonderful Subject');
$mailer->send($message);

输出

++ Starting Swift_SmtpTransport
<< 220 example.com ESMTP ready
>> EHLO [127.0.0.1]
<< 250-example.com
250-SIZE 5242880
250-PIPELINING
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-AUTH PLAIN LOGIN CRAM-MD5
250 STARTTLS
>> AUTH CRAM-MD5
<< 235 2.0.0 OK
++ Swift_SmtpTransport started
>> MAIL FROM: <john@example.com>
<< 250 2.1.0 Ok
>> RCPT TO: <receiver@example.com>
<< 250 2.1.0 Ok
>> DATA
<< 354 Go ahead
>>
.
<< 250 2.0.0 Ok: queued as 7A821440123E
1++ Stopping Swift_SmtpTransport
>> QUIT
<< 221 2.0.0 Bye
++ Swift_SmtpTransport stopped

正如您在最后看到的,有所需的 id。

自定义插件

Swift_Transport提供了一个用于注册插件的接口。它只不过是将事件侦听器附加到事件调度程序。您可以自己编写一个简单的插件。您需要做的就是实施Swift_Events_ResponseListener

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());

根据文档,不需要第三方插件来获取消息ID。Message-ID 由 SwiftMailer 设置,否则 SMTP 服务器会自己创建一个。因此,您所需要的只是:

$message = 'Swift_Message::newInstance($subject, $body);
...
$messageID = $message->getId();