Свифт Мейлер отправить в очередь для последующей доставки
При использовании http://swiftmailer.org/ могу ли я отправить сообщение в почтовую очередь, чтобы php сразу же вернулся, а не отправлял сообщение прямо сейчас?
3 ответа
Это старый вопрос, но так как он появился в моем поиске в Google, я отвечу на него тем, что выяснил.
ДА! Swiftmailer имеет возможность писать в спул вместо отправки сразу. Реализация довольно проста:
$spool = new Swift_FileSpool('/where/you/want/your/spool');
$transport = Swift_SpoolTransport::newInstance($spool);
$mailer = Swift_Mailer::newInstance($transport);
Это говорит swiftmailer записывать сообщения на диск, а не отправлять их. Затем с помощью задания cron или другого триггера отправьте сообщения, используя что-то вроде:
$spool = new Swift_FileSpool('/where/you/put/your/spool');
$spool_transport = Swift_SpoolTransport::newInstance($spool);
// Create the smtp transport.
$smtp_transport = Swift_SmtpTransport::newInstance('your.smtp.host', 25);
// Get the messages from the spool
$spool = $spool_transport->getSpool();
// Send the messages via the real transport.
$sent = $spool->flushQueue($smtp_transport);
Ты не можешь swiftmailer/php на самом деле не доставляет почту для вас, она просто передает ее на SMTP-сервер, и этот сервер выполняет доставку для вас. Вы должны указать SMTP не обрабатывать исходящую очередь, чтобы "остановить" доставку.
С точки зрения реального мира, swift/php просто зайдите в угол и бросьте конверт в почтовый ящик. Почтовый грузовик обнаруживается сразу после этого и запускает процесс отправки почты по пути через почтовую систему. Но это полностью выходит за рамки PHP.
Если вы используете транспорт sendmail, он должен сразу вернуться.
С https://github.com/swiftmailer/swiftmailer/blob/4.1/doc/sending.rst:
Обычно процесс sendmail реагирует быстро, так как перед отправкой отправляет ваши сообщения на диск.
Вы также можете взглянуть на спулинг: http://symfony.com/doc/current/cookbook/email/spool.html