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

Dmi*_*tro 5 php swiftmailer

当我使用telnet发送电子邮件时,smtp服务器会在发送电子邮件250 2.0.0 Ok: queued as 7A821440123E时回复我.所以我需要获取ID 7A821440123E来跟踪邮件日志中的电子邮件.使用Swiftmailer获取此功能是否可行?

小智 13

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

现有插件

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

产量

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

正如你在最后看到的,有所需的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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后只需在邮件程序实例中注册您的插件

$mailer->registerPlugin(new FindEmailIdResponse());
Run Code Online (Sandbox Code Playgroud)

  • 换句话说,Swift Mailer 似乎没有提供开箱即用的这条信息,您需要自己从服务器响应中解析它。虽然库必须进行一些基本的解析,但它只对 250 状态代码感兴趣。太糟糕了,您无法直接访问确切的日志行。 (2认同)