重定向前使用SwiftMailer


Using SwiftMailer before a redirect

在重定向之前,我有一个关于使用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对象。