当我使用telnet发送电子邮件时,smtp服务器会在发送电子邮件时回答我250 2.0.0 Ok: queued as 7A821440123E
。所以我需要获取ID 7A821440123E
来跟踪邮件日志中的电子邮件。
使用Swiftmailer获取此功能是否可行?
答案 0 :(得分:13)
SwiftMailer基于事件,因此可以被其他开发人员轻松扩展。每次调用send
上的Swift_Transport
方法时,都会调度正确的事件。您既可以使用已经开发的监听器(插件),也可以编写自己的监听器(自定义监听器)。
SwiftMailer已经发布了一些plugins,您可以使用它来解决问题。
只需使用logger plugin即可。它将在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
正如你在最后看到的那样,有所需的身份。
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());
答案 1 :(得分:2)
根据documentation,不需要第三方插件来获取Message-ID。 Message-ID由SwiftMailer设置,否则SMTP服务器自己创建一个。 所以,你所需要的只是:
$message = \Swift_Message::newInstance($subject, $body);
...
$messageID = $message->getId();