1

我有一个关于在重定向之前使用 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但是,对我的 Bolt 项目进行了一些搜索,我似乎找不到它被设置在任何地方。如果启用了假脱机,那么直到内核终止阶段才会发送电子邮件,重定向(die将避免)。

4

2 回答 2

1

好的,我找到了方法:

$app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']);

通过在重定向之前添加这一行,它会使内核发送电子邮件。

原因如下:

Swiftmailer 提供程序使用 KernelEvents::TERMINATE事件发送电子邮件,该事件在响应发送后触发。但是,由于控制台命令不会触发此事件,因此不会发送您的电子邮件。

于 2014-10-31T16:30:09.427 回答
0

放一个returnsimpleredirect。这是必需的,因为每个控制器操作都必须返回Response对象。

在这种情况下return '',Symfony 自己创建Response对象。

于 2014-10-31T12:36:04.073 回答