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