2016-01-15 3 views
2

Я пытаюсь использовать другую конфигурацию SMTP для каждого пользователя моего приложения. Таким образом, используя Swift_SmtpTransport, установите новый экземпляр транспорта, назначьте его Swift_Mailer и затем назначьте его Laravel Mailer.Laravel Mail Queue: изменить транспорт на лету

Ниже приводится полный фрагмент кода:

$transport = Swift_SmtpTransport::newInstance($mailConfig['smtp_host'], $mailConfig['smtp_port'], 'ssl'); 
$transport->setUsername($mailConfig['smtp_user']); 
$transport->setPassword($mailConfig['smtp_pass']); 
$smtp = new Swift_Mailer($transport); 
Mail::setSwiftMailer($smtp); 
Mail::queue(....); 

сообщения добавляются в очередь, но никогда не отправляется. Я предполагаю, что, поскольку «реальная» отправка является асинхронной, она использует конфигурацию по умолчанию SMTP, а не транспортную установку перед Mail :: queue().

Итак, вопрос в том, как изменить почтовый транспорт при использовании Mail :: queue()?

+1

Просто спросить, есть ли у вас очереди слушателя? Поскольку ваш код выглядит нормально на основе Swift Mailer Docs – Froxz

+0

@Froxz да, я использую очередь: работайте с флагом --daemon. Supervisord работает без ошибок. – Luciano

+1

Какая версия Laravel вы используете? – Bogdan

ответ

3

Вместо того, чтобы использовать Mail::queue, попробуйте creating a queue job class, который обрабатывает отправку электронной почты. Таким образом, код переключения транспорта будет выполняться при обработке задания.

В действительности, Job Class Structure Documentation использует сценарий почтовой рассылки, который получает экземпляр Mailer, которым вы можете манипулировать. Просто используйте свой код в handle методе класса:

public function handle(Mailer $mailer) 
{ 
    $transport = Swift_SmtpTransport::newInstance($mailConfig['smtp_host'], $mailConfig['smtp_port'], 'ssl'); 
    $transport->setUsername($mailConfig['smtp_user']); 
    $transport->setPassword($mailConfig['smtp_pass']); 
    $smtp = new Swift_Mailer($transport); 

    $mailer->setSwiftMailer($smtp); 

    $mailer->send('viewname', ['data'], function ($m) { 
     // 
    }); 
} 
+0

спасибо за помощь. Это, кажется, правильное решение, так или иначе я получаю странную ошибку «исключение» Swift_TransportException с сообщением «Соединение невозможно установить с помощью host mailtrap.io». $ mailConfig содержит правильные учетные данные, то же самое, что работает с собственной почтовой очередью. – Luciano

+0

никогда не было, это была ошибка конфигурации. Кажется, что mailtrap.io не поддерживает ssl, поэтому в методе newInstance я просто удалил параметр. – Luciano

+0

Другой вопрос для полноты: $ this-> dispatch (new JobName ($ data)) принимает только один аргумент, или я могу предоставить любые аргументы, объявленные в конструкторе класса заданий? – Luciano

Смежные вопросы