У меня есть проблема, касающаяся использования 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
буду избегать).
ОК, я нашел, как это сделать:
$app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']);
Добавляя эту строку перед перенаправлением, она заставляет ядро отправить электронное письмо.
Вот причина:
Поставщик Swiftmailer отправляет электронные письма, используя
KernelEvents::TERMINATE
событие, которое запускается после ответа
было отправлено. Однако, поскольку это событие не запускается для консольных команд,
ваши письма не будут отправлены.
Положить return
до simpleredirect
, Это необходимо, поскольку каждое действие контроллера должно возвращаться Response
объект.
В случае return ''
Симфония сама создай Response
объект.