Saya memiliki proyek Symfony yang (sangat disederhanakan) terlihat seperti ini:

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

    }
}

Layanan/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;
    }
}

Jika Anda melihat MyToolController.php Anda melihat bahwa saya memanggil layanan yang mengirimkan email.

Jika saya mengembalikan objek Response dalam fungsi run() saya, semuanya berjalan dengan baik - tetapi jika saya menghilangkan ini, tidak ada yang dikirim. Sama jika saya mengirim banyak email dalam satu lingkaran dan saya mengalami batas waktu.

Anehnya $mailer->send() dipanggil dalam hal apa pun - dan itu mengembalikan 1 - dan saya melihat entri di log yang saya tulis di fungsi sendmail(). Tapi tidak ada email yang keluar dari server.

Ini adalah konfigurasi SwiftMailer saya:

swiftmailer:
    url: '%env(MAILER_URL)%'
    spool: { type: 'memory' }
2
Gerfried 3 Maret 2020, 20:31

1 menjawab

Jawaban Terbaik

Email Anda sedang disimpan di memori, yang artinya:

Saat Anda menggunakan spooling untuk menyimpan email ke memori, email akan dikirim tepat sebelum kernel berakhir. Ini berarti email hanya dikirim jika seluruh permintaan dijalankan tanpa pengecualian yang tidak ditangani atau kesalahan apa pun.

Jika Anda tidak mengembalikan objek Response dari pengontrol Anda, akan ada pengecualian yang tidak tertangani, seluruh permintaan tidak akan dieksekusi, dan email akan tidak pernah dikirim.

Pengontrol perlu mengembalikan Symfony\Component\HttpFoundation\Response sehingga permintaan dapat ditangani secara normal. Jika Anda ingin mengembalikan respons kosong, Anda cukup melakukan:

return new Response();
5
yivi 3 Maret 2020, 18:26