Swiftmailer没有立即发送

Vic*_*tor 3 configuration swiftmailer symfony ubuntu-14.04

我已经成功将我的symfony网络应用程序配置为使用SMTP发送电子邮件。但是我所有发送的电子邮件都被放入spool目录中。

仅在发送中出现错误时才会发生这种情况。那是对的吗?

但是,如果我执行命令swiftmailer:spool:send --env=prod,则我的所有电子邮件都可以正确发送。

为什么我的服务器没有立即发送电子邮件?那是因为我修复了错误吗?有没有什么办法解决这一问题?

swiftmailer:

spool:
    type: file
    path: %kernel.root_dir%/spool
Run Code Online (Sandbox Code Playgroud)

sri*_*igi 5

如果有人通过消息队列(symfony / messenger)处理电子邮件,则首选使用内存假脱机。但是,仅在Kernel::terminate事件时才处理内存假脱机。在长时间运行的控制台工作程序上永远不会发生此事件。

此内核事件是调用Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener::onTerminate()方法。您可以通过调度自己的事件并为其预订上述方法来手动调用此方法。

src/App/Email/Events.php

<?php

namespace App\Email;

class Events
{
    public const UNSPOOL = 'unspool';
}
Run Code Online (Sandbox Code Playgroud)

config/services.yml

services:    
    App\Email\AmqpHandler:
      tags: [messenger.message_handler]

    Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener:
        tags:
            - name: kernel.event_listener
              event: !php/const App\Email\Events::UNSPOOL
              method: onTerminate
Run Code Online (Sandbox Code Playgroud)

您的消息队列工作者 src/App/Email/AmqpHandler.php

<?php

namespace App\Email;

use Symfony\Component\EventDispatcher\EventDispatcherInterface;

class AmqpHandler
{
    /** @var EventDispatcherInterface */
    private $eventDispatcher;

    /** @var Swift_Mailer */
    private $mailer;

    public function __construct(EventDispatcherInterface $eventDispatcher, Swift_Mailer $mailer)
    {
        $this->eventDispatcher = $eventDispatcher;
        $this->mailer = $mailer;
    }

    public function __invoke($emailMessage): void
    {
        //...
        $message = (new Swift_Message($subject))
            ->setFrom($emailMessage->from)
            ->setTo($emailMessage->to)
            ->setBody($emailMessage->body, 'text/html');

        $successfulRecipientsCount = $this->mailer->send($message, $failedRecipients);
        if ($successfulRecipientsCount < 1 || count($failedRecipients) > 0) {
            throw new DeliveryFailureException($message);
        }

        $this->eventDispatcher->dispatch(Events::UNSPOOL);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读有关symfony / messenger的 信息