为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕斯709654 2022-10-14 14:47:15
我有一个 Symfony 项目(非常简化),如下所示:控制器/MyToolController.phpnamespace 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.phpnamespace 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您会看到我调用了发送电子邮件的服务。如果我在我的函数中返回一个Response对象run(),一切都会顺利 - 但如果我省略它,则不会发送任何内容。如果我在一个循环中发送多封电子邮件并且遇到超时也是如此。无论如何都会调用Strangely $mailer->send()- 它返回 1 - 我在sendmail()函数中写入的日志中看到一个条目。但是没有电子邮件离开服务器。这是我的 SwiftMailer 配置:swiftmailer:    url: '%env(MAILER_URL)%'    spool: { type: 'memory' }
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

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

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

如果您不Response从控制器返回对象,则会出现未处理的异常,整个请求将不会被执行,并且永远不会发送邮件。

控制器需要返回 aSymfony\Component\HttpFoundation\Response以便可以正常处理请求。如果您想返回一个空响应,您可以简单地执行以下操作:

return new Response();


查看完整回答
反对 回复 2022-10-14
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号