При отправке писем от работника они не отправляются, пока не будет сгенерировано исключение - PullRequest
0 голосов
/ 21 октября 2019

Я помещаю несколько писем в очередь. Когда я запускаю работника, он успешно обрабатывает все письма, но они не отправляются. Когда я добавляю письмо, которое вызывает исключение, работник уничтожается, и все письма отправляются.

Когда я запускаю bin/console swiftmailer:spool:send после обработки писем с работником, он показывает:

0 emails sent

Также пытался forceSend(), тоже не сработало.

Рабочий:

class SendQueuedMailWorker
{
    /**
     * @var Mailer
     */
    private $mailer;


    public function __construct(
        Mailer $mailer
    ) {
        $this->mailer = $mailer;
    }


    public function handle(SendQueuedMailCommand $command): void
    {

        $user = $command->getUser();

        $mailContext = [
            'user' => $user
        ];

        $message = $this->mailer->compose(
            'mail_template',
            $mailContext,
            null,
            $user->getEmail()
        );


        if ($this->mailer->send($message) === false) {
            throw QueuedMailNotSentException::withId($command->getReference());
        }
    }
}

Swiftmailer:

swiftmailer:
  transport:          '%mailer_transport%'
  encryption:         '%mailer_encryption%'
  host:               '%mailer_host%'
  port:               '%mailer_port%'
  username:           '%mailer_user%'
  password:           '%mailer_password%'
  delivery_addresses: '%mailer_delivery_addresses%'
  spool:              { type: 'memory' }
  disable_delivery:   '%mailer_disable_delivery%'

Нет сообщений об ошибках, возникающих при использовании очереди.

Вывод на консоль:

Consuming from mailsend queue
[1] Processing payload {"reference":2016320254, "user":"John"}
[1] processed with result: true
[2] Processing payload {"reference":2019990645, "user":"Doe"}
[2] processed with result: true

Как получить сообщения для немедленной отправки?

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Окончательное решение:

Создать MailerSpoolFlusher. Введите \Swift_MemorySpool и \Swift_Transport в него.

В MailerSpoolFlusher добавьте:

public function flush()
{
    $this->spool->flushQueue($this->transport);
}

Затем введите MailerSpoolFlusher в рабочий и вызовите flush() после $mailer->send().

Работыкак заклинание, и нет необходимости инициировать onTerminate.

0 голосов
/ 21 октября 2019

Исправлено с помощью: https://stackoverflow.com/a/51730638/11830313

Оказывает, что буферные письма, которые обрабатываются работником, будут отправляться только на Kernel::terminate.

Мне кажется, это решительное решение, так что если у кого-то есть другое решение проблемы, я буду более чем счастлив услышать его.

...