簡體   English   中英

Symfony SwiftMailer:如果控制器不返回 $this->render() 響應,則不發送

[英]Symfony SwiftMailer: not sending if the controller does not return a $this->render() response

我有一個 Symfony 項目(非常簡化)如下所示:

控制器/MyToolController.php

namespace App\Controller;

use App\Services\ToolsService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class MyToolController extends AbstractController
{
    private $toolsService;


    /**
     * @param ToolsService|null $toolsService
     */
    public function __construct(ToolsService $toolsService = null) {
        $this->toolsService = $toolsService;
    }

    public function run() {
        // some more code here...

        $mailContent = $this->render('site/mail.html.twig', $data)->getContent();
        $this->toolsService->sendMail($from, $to, $bcc, $mailContent, $subject);

        // if I remove the following line, no emails are sent out!
        return $this->render('site/thankyou.html.twig', $data);

    }
}

服務/MyToolService.php

namespace App\Services;

class ToolsService
{

    /** @var \Swift_Mailer */
    private $mailer;

    /**
     * @param \Swift_Mailer $mailer
     */
    public function __construct(\Swift_Mailer $mailer)
    {
        $this->mailer = $mailer;
    }

    public function sendMail($from, $to, $bcc, $body, $subject) {
        $mail = ( new \Swift_Message() )
            ->setSubject($subject)
            ->setFrom($from)
            ->setTo($to)
            ->setBcc($bcc)
            ->addPart($body, 'text/html');

        $res = $this->mailer->send($mail);
        $this->logger->info('Email sent');

        return $res;
    }
}

如果您查看MyToolController.php您會看到我調用了發送電子郵件的服務。

如果我在我的run()函數中返回一個Response對象,一切都會順利 - 但如果我省略這個,則不會發送任何內容。 如果我循環發送多封電子郵件並且遇到超時,則情況相同。

奇怪的是,在任何情況下都會調用$mailer->send() - 它返回 1 - 我在sendmail()函數中寫入的日志中看到一個條目。 但是沒有電子郵件離開服務器。

這是我的 SwiftMailer 配置:

swiftmailer:
    url: '%env(MAILER_URL)%'
    spool: { type: 'memory' }

您的郵件正在內存中,這意味着

當您使用假脫機將電子郵件存儲到內存時,它們將在內核終止之前立即發送。 這意味着只有在沒有任何未處理的異常或任何錯誤的情況下執行整個請求時才會發送電子郵件。

如果你沒有從控制器返回一個Response對象,就會出現一個未處理的異常,整個請求不會被執行,郵件也不會被發送。

控制器需要返回一個Symfony\\Component\\HttpFoundation\\Response才能正常處理請求。 如果你想返回一個空的響應,你可以簡單地做:

return new Response();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM