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



我有一个Symfony项目,它(非常简化(看起来像这样:

Controller/MyToolController.php

namespace AppController;
use AppServicesToolsService;
use SymfonyBundleFrameworkBundleControllerAbstractController;
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 AppServices;
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对象,将出现未处理的异常,整个请求不会执行,邮件也不会发送。

控制器需要返回一个SymfonyComponentHttpFoundationResponse,以便可以正常处理请求。如果你想返回一个空的响应,你可以简单地做:

return new Response();

最新更新