Ответ 1
Это связано с тем, что по умолчанию SwiftmailerServiceProvider
использует Swift_MemorySpool
и только сбрасывает это на kernel.terminate
. Позвольте мне сделать шаг назад и объяснить каждую часть этого.
-
SwiftmailerServiceProvider
отвечает за регистрацию служб Swiftmailer и конфигурации по умолчанию. По умолчанию транспорт (swiftmailer.spooltransport
) равенSwift_SpoolTransport
, аswiftmailer.spool
-Swift_MemorySpool
. -
Swiftmailer поддерживает различные способы отправки писем. Они называются транспортом. Транспортировка катушки действует как очередь. Вы можете сохранить эту очередь в файле или в памяти. Транспортировка катушек имеет метод
flushQueue
, который позволяет сбрасывать почтовые отправления в реальный транспорт, который должен их доставлять. -
Symfony2 HttpKernel, который использует Silex, испускает ряд событий в течение жизненного цикла каждого запроса. Последний, который он испускает, - это событие
kernel.terminate
. Это событие запускается после отправки тела ответа HTTP. Это позволяет выполнять тяжелые задачи после рендеринга страницы, чтобы она больше не отображалась как загрузка пользователю. -
SwiftmailerServiceProvider
подписывается на событиеkernel.terminate
, чтобы очистить буфер памяти после того, как страница была отображена. Он сбрасывает его в службуswiftmailer.transport
, которая являетсяSwift_Transport_EsmtpTransport
, которая выполняет фактическую отправку через SMTP.
Итак, давайте перейдем к реальной проблеме. Вы находитесь в контексте CLI, поэтому ни одно из этих событий HttpKernel не будет запущено. И поскольку событие kernel.terminate
не запускается, ваша катушка не очищается. И, таким образом, ваши письма не отправляются.
Для этого есть два хороших решения:
-
A) Промойте катушку вручную. Просто делайте то, что делает провайдер в своем слушателе. Добавьте это в конец команды CLI:
if ($app['mailer.initialized']) { $app['swiftmailer.spooltransport']->getSpool()->flushQueue($app['swiftmailer.transport']); }
-
B) Повторно настройте службу
mailer
для непосредственного использования транспорта ESMTP, не проходя через катушку:$app['mailer'] = $app->share(function ($app) { return new \Swift_Mailer($app['swiftmailer.transport']); });
Любое решение должно быть выполнено. Удачи!