Mik*_*osh 11 php swiftmailer silex
我正在制作一个使用SwiftMail扩展程序发送的控制台应用程序.由于我们的策略,我有两个虚拟机,一个用作SMTP中继,另一个用作应用服务器.通过telnet手动发送邮件到继电器工作正常.使用SwiftMail时,它已经坏了.
返回标头,$failure变量中没有返回任何条目send()
回应 getHeaders()->toString()
Message-ID: <1351104631.508838778dc03@swift.generated>
Date: Wed, 24 Oct 2012 14:50:31 -0400
Subject: [YourSite] Feedback
From: noreply@localhost.com
To: sixeightzero@localhost.com
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Run Code Online (Sandbox Code Playgroud)
如果我回应send(),我得到1.
boot.php
$app->register(new Silex\Provider\SwiftmailerServiceProvider(), array(
'swiftmailer.options' => array(
'host' => 'ip.host.relay',
'port' => 25,
'encryption' => null,
'auth_mode' => null
),
));
Run Code Online (Sandbox Code Playgroud)
app.php
$message = \Swift_Message::newInstance( )
->setSubject('[YourSite] Feedback')
->setFrom(array('noreply@localhost.com'))
->setTo(array('sixeightzero@localhost.com'))
->setBody("Message!");
$app['mailer']->send($message, $failures);
Run Code Online (Sandbox Code Playgroud)
当我在应用服务器上运行TCP转储并运行脚本时,没有建立任何SMTP连接,并且没有抛出任何错误.
有没有遇到过这个?由于我们的应用程序要求,我不想使用sendmail或邮件,而是使用SMTP.
igo*_*orw 41
这是因为默认情况下SwiftmailerServiceProvider使用a Swift_MemorySpool,并且只刷新它kernel.terminate.让我退后一步,解释一下这一部分.
该SwiftmailerServiceProvider负责注册的Swiftmailer服务和默认配置.默认情况下,运输(swiftmailer.spooltransport)是Swift_SpoolTransport和swiftmailer.spool是Swift_MemorySpool.
Swiftmailer支持不同的邮件发送方式.这些被称为运输.假脱机传输充当队列.您可以将此队列存储在文件或内存中.线轴传输有一种flushQueue方法可以将排队的邮件刷新到真正的传输,这应该传递它们.
Silex使用的Symfony2 HttpKernel在每个请求的生命周期中发出许多事件.它发出的最后一个是kernel.terminate事件.在发送HTTP响应主体后触发此事件.这允许您在渲染页面后执行繁重的任务,以便它不再显示为加载到用户.
在SwiftmailerServiceProvider对订阅kernel.terminate为了事件刷新内存阀芯的页面已经呈现后.它将其刷新为swiftmailer.transport服务,这是Swift_Transport_EsmtpTransport通过SMTP进行实际发送.
那么让我们来解决实际问题吧.您处于CLI上下文中,因此不会触发这些HttpKernel事件.并且由于kernel.terminate事件未被触发,因此您的线轴未被刷新.因此,您的电子邮件不会被发送.
有两个很好的解决方案:
A)手动冲洗阀芯.只需执行提供程序在其侦听器中执行的操作.在CLI命令的末尾添加:
if ($app['mailer.initialized']) {
$app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']);
}
Run Code Online (Sandbox Code Playgroud)B)重新配置mailer服务以直接使用ESMTP传输而无需通过假脱机:
$app['mailer'] = $app->share(function ($app) {
return new \Swift_Mailer($app['swiftmailer.transport']);
});
Run Code Online (Sandbox Code Playgroud)两种解决方案都应该做到.祝好运!