Rails Action Mailer с Deliver_later на AWS

Мое производственное приложение работает на AWS, но у меня возникают проблемы с активным заданием - deliver_later на некоторых почтовых программах. Я успешно отправляю все электронные письма с deliver_later в разработке, но в производстве есть что-то другое. Некоторые почтовые программы работают с deliver_later, но не мой приветственный почтовик (приветствует новых пользователей). Поэтому я должен установить deliver_now в этой приветственной почтовой программе, чтобы она действительно отправила электронное письмо.

//doesn't work, email is not sent
UserMailer.welcome_email(self).deliver_later
//works
UserMailer.welcome_email(self).deliver_now

Файл журнала с сервера показывает это и ничего больше, когда я использую deliver_later:

[ActiveJob] ActionMailer::DeliveryJob поставлен в очередь (идентификатор задания: d7114-464e-4a90-9721-126650) в Async(почтовые программы) с аргументами: "UserMailer", "welcome_email", "deliver_now", #>

Любая помощь будет оценена по достоинству. Спасибо.


person Gabriel O    schedule 27.03.2018    source источник


Ответы (4)


deliver_now Доставляет электронную почту за один раз.

Если вы используете deliver_later, вы должны использовать средство запуска ActiveJob, такое как Sidekiq, вы можете увидеть это gist Sending emails with ActionMailer and Sidekiq также см. это для базового Sidekiq отправленного электронного письма.

Ставит электронное письмо в очередь для доставки через Active Job. Когда задание запустится, оно отправит электронное письмо, используя deliver_now.

UserMailer.welcome_email(self).deliver_later(wait: 1.hour)

method-i-deliver_later

По сути, deliver_later является асинхронным. Когда вы используете этот метод, электронная почта в данный момент не отправляется, а помещается в очередь заданий. Если задание не запущено, электронное письмо не будет отправлено. deliver_now отправит электронное письмо в данный момент, независимо от состояния задания. Здесь можно просмотреть документацию по методам доставки.

person fool-dev    schedule 27.03.2018

Какой сервер ActiveJob вы используете?

  • ActiveJob для обеспечения асинхронного выполнения, но не обеспечивает асинхронность как таковую.

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

person Jan Krupa    schedule 27.03.2018

Это потому, что вы не установили время, и рельсы выбирают время по умолчанию. и в файле журнала также видно, что метод delivery_later еще не вызывается.

Попробуйте использовать:

UserMailer.welcome_email(self).deliver_later(wait: 1.minute)

Затем проверьте журнал через одну минуту.

person Romanch Sharma    schedule 27.03.2018

Если вы используете delayed_job, вам нужно запустить rake jobs:work

https://www.youtube.com/watch?v=AoGPaWEasxs

person Jun Dalisay    schedule 18.03.2019