Symfony SwiftMailer:如果控制器不返回 $this->render() 响应,则不发送

Ger*_*ied 2 php swiftmailer symfony symfony4

我有一个 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);

    }
}
Run Code Online (Sandbox Code Playgroud)

服务/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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您查看,MyToolController.php您会发现我调用了发送电子邮件的服务。

如果我Response在我的run()函数中返回一个对象,一切都会顺利 - 但如果我省略了这一点,则不会发送任何内容。如果我循环发送多封电子邮件并且遇到超时,则情况相同。

奇怪的$mailer->send()是在任何情况下都会被调用 - 它返回 1 - 我在sendmail()函数中写入的日志中看到一个条目。但是没有电子邮件离开服务器。

这是我的 SwiftMailer 配置:

swiftmailer:
    url: '%env(MAILER_URL)%'
    spool: { type: 'memory' }
Run Code Online (Sandbox Code Playgroud)

yiv*_*ivi 5

您的邮件正在内存中,这意味着

当您使用假脱机将电子邮件存储到内存时,它们将在内核终止之前立即发送。这意味着只有在没有任何未处理的异常或任何错误的情况下执行整个请求时才会发送电子邮件。

如果你没有Response从控制器返回一个对象,就会出现一个未处理的异常,整个请求不会被执行,邮件也不会被发送。

控制器需要返回 aSymfony\Component\HttpFoundation\Response才能正常处理请求。如果你想返回一个空的响应,你可以简单地做:

return new Response();
Run Code Online (Sandbox Code Playgroud)

  • 考虑到OP想完全省略返回响应,我想这不是他们关心的问题。 (2认同)