Symfony SwiftMailer: не отправлять, если контроллер не возвращает ответ $ this-> render () - PullRequest
2 голосов
/ 03 марта 2020

У меня есть Symfony проект, который (очень упрощенно) выглядит следующим образом:

Controller / 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);

    }
}

Services / 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, вы увидите, что я вызываю службу, которая отправляет электронное письмо.

Если я возвращаю Response объект в моей функции run(), все идет хорошо - но если я опущу это, ничего не будет отправлено. То же самое, если я отправляю несколько писем в al oop и у меня возникает тайм-аут.

Странно $mailer->send() вызывается в любом случае - и возвращается 1 - и я вижу запись в журнале, который я пишу в функции sendmail(). Но никакая электронная почта не покидает сервер.

Это моя конфигурация SwiftMailer:

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

1 Ответ

5 голосов
/ 03 марта 2020

Ваши письма помещаются в буфер, , что означает :

Когда вы используете буферизацию для хранения писем в памяти, они будут отправлены непосредственно перед завершением работы ядра. Это означает, что электронное письмо отправляется только в том случае, если весь запрос был выполнен без каких-либо необработанных исключений или каких-либо ошибок.

Если вы не вернете объект Response из вашего контроллера, будет необработанным исключением, весь запрос не будет выполнен и письма никогда не будут отправлены.

Контроллеры должны возвращать Symfony\Component\HttpFoundation\Response, чтобы запрос мог обрабатываться в обычном режиме. Если вы хотите вернуть пустой ответ, вы можете просто сделать:

return new Response();
...