2014-10-31 103 views
1

我有一個關於在重定向之前使用SwiftMailer的問題。如果我允許控制器提出請求,那麼電子郵件發送正常。例如:在重定向之前使用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將避免)。

+0

在'simpleredirect'之前放置'return' – 2014-10-31 12:30:33

回答

1

OK,我發現如何做到這一點:

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

通過它使籽粒發送電子郵件的重定向前加入這一行。

這裏的原因是:

的Swiftmailer提供商將使用 KernelEvents::TERMINATE事件,響應已 發出後即被啓動電子郵件。但是,由於此事件不是因控制檯命令而被解僱的,因此您的電子郵件將不會發送到 。

+0

官方推薦的方法是執行一個控制檯命令 - http://symfony.com/doc/3.2/console/command_in_controller.html – 2017-08-02 12:35:05

0

simpleredirect之前加上return。這是必需的,因爲每個控制器操作必須返回Response對象。

如果是return '',Symfony本身會創建Response對象。

+0

由於'simpleredirect'具有'die()'命令,所以不起作用。 – diggersworld 2014-10-31 12:59:10

+0

然後你應該在你的問題中提到它。無論如何,添加'simpleredirect'代碼,然後我可以進一步幫助。 – 2014-10-31 13:16:18

+0

我認爲這很明顯,因爲這就是重定向一般工作的方式。他們通常終止,因爲他們之後不需要輸出。 – diggersworld 2014-10-31 13:18:59