【问题标题】:Using SwiftMailer before a redirect在重定向之前使用 SwiftMailer
【发布时间】:2014-11-01 00:34:15
【问题描述】:

我有一个关于在重定向之前使用 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 将避免)。

【问题讨论】:

  • simpleredirect之前放一个return

标签: php symfony swiftmailer bolt-cms


【解决方案1】:

好的,我找到了方法:

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

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

原因如下:

Swiftmailer 提供商使用 KernelEvents::TERMINATE 事件,在响应完成后触发 已经送走了。但是,由于控制台命令不会触发此事件, 您的电子邮件将不会被发送。

【讨论】:

【解决方案2】:

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

如果是return '',Symfony 自己会创建Response 对象。

【讨论】:

  • 这行不通,因为simpleredirect 有一个die() 命令。
  • 那么你应该在你的问题中提到它。无论如何,添加simpleredirect 代码然后我可以提供进一步的帮助。
  • 我认为这很明显,因为重定向通常是这样工作的。它们通常终止,因为在它们之后不需要输出。
猜你喜欢
  • 2016-04-05
  • 1970-01-01
  • 2013-01-07
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
相关资源
最近更新 更多