Использование SwiftMailer перед перенаправлением

У меня есть проблема, касающаяся использования SwiftMailer перед перенаправлением. Если я позволю контроллеру, делающему запрос, вернуться, письма будут отправлены нормально. Например:

function foo() {

// ...

$message = \Swift_Message::newInstance()
->setSubject($subject)
->setFrom($sender)
->setTo($recipient)
->setBody(strip_tags($html))
->addPart($html, 'text/html');
$result = $this->app['mailer']->send($message);

return '';
}

Вышеуказанное работает, пока я возвращаю ненулевой ответ.

Однако, если я делаю то же самое, но с перенаправлением, как это:

function foo() {

// ...

$message = \Swift_Message::newInstance()
->setSubject($subject)
->setFrom($sender)
->setTo($recipient)
->setBody(strip_tags($html))
->addPart($html, 'text/html');
$result = $this->app['mailer']->send($message);

simpleredirect($this->app['paths']['root']);
}

Тогда сообщение не отправлено.

Обратите внимание simpleredirect() Функция завершает работу скрипта, как это принято в стандартной практике.

В обоих примерах $result возвращается как количество указанных получателей. Поэтому я могу только предположить, что почта находится в очереди, и какая-то отправка выполняется с обычным возвратом, который пропускается при наличии перенаправления.

У меня есть ощущение, что SwiftMailer spool опция может быть включена. Однако, делая несколько поисков моих проектов Bolt, я не могу найти его где-нибудь установленным. Если буферизация включена, то электронное письмо не будет отправлено до фазы завершения ядра, которая перенаправляет die буду избегать).

1

Решение

ОК, я нашел, как это сделать:

$app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']);

Добавляя эту строку перед перенаправлением, она заставляет ядро ​​отправить электронное письмо.

Вот причина:

Поставщик Swiftmailer отправляет электронные письма, используя
KernelEvents::TERMINATE событие, которое запускается после ответа
было отправлено. Однако, поскольку это событие не запускается для консольных команд,
ваши письма не будут отправлены.

1

Другие решения

Положить return до simpleredirect, Это необходимо, поскольку каждое действие контроллера должно возвращаться Response объект.

В случае return ''Симфония сама создай Response объект.

0

По вопросам рекламы [email protected]