在重定向之前,我有一个关于使用SwiftMailer的问题。如果我允许提出请求的管理员返回,那么电子邮件就会被发送。例如:
function foo() {
// ...
$message = 'Swift_Message::newInstance()
->setSubject($subject)
->setFrom($sender)
->setTo($recipient)
->setBody(strip_tags($html))
->addPart($html, 'text/html');
$result = $this->app['mailer']->send($message);
return '';
}
只要我返回一个非空的响应,上述方法就可以工作。
然而,如果我也这样做,但重定向如下:
function foo() {
// ...
$message = 'Swift_Message::newInstance()
->setSubject($subject)
->setFrom($sender)
->setTo($recipient)
->setBody(strip_tags($html))
->addPart($html, 'text/html');
$result = $this->app['mailer']->send($message);
simpleredirect($this->app['paths']['root']);
}
则消息不会发送。
注意:simpleredirect()
函数终止脚本,这是标准做法。
在这两个示例中,$result
都返回为指定收件人的数量。因此,我只能假设邮件是排队的,并且某种调度运行在传统的返回上,而在重定向的情况下,这种返回会被错过。
我有一种感觉,SwiftMailer spool
选项可能会被启用。然而,在搜索我的博尔特项目时,我似乎找不到它的背景。如果启用了后台处理,则在核心终止阶段之前不会发送电子邮件,重定向(使用die
将避免)。
好的,我找到了怎么做:
$app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']);
通过在重定向之前添加这一行,它使内核发送电子邮件。
原因如下:
Swiftmailer提供商使用
KernelEvents::TERMINATE
事件,在响应已发送。但是,由于此事件不是为控制台命令触发的,您的电子邮件将不会被发送。
将return
放在simpleredirect
之前。这是必需的,因为每个控制器操作都必须返回Response
对象。
在return ''
的情况下,Symfony自己创建Response
对象。