在AWS上使用deliver_later的Rails Action Mailer

时间:2018-03-27 04:15:49

标签: ruby-on-rails amazon-ec2 rails-activejob

我的生产应用程序在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”,#>

任何帮助将不胜感激。感谢。

4 个答案:

答案 0 :(得分:1)

您使用的是什么ActiveJob后端?

  • ActiveJob提供异步执行但不提供异步性本身。

您需要使用一些异步后端,例如sidekiqdelayed_job或其他。

答案 1 :(得分:1)

deliver_now一次发送一封电子邮件。

如果你使用deliver_later,你必须使用像Sidekiq这样的ActiveJob赛跑者,你可以看到这个gist Sending emails with ActionMailer and Sidekiq也会看到发送的基本Sidekiq电子邮件。

将通过活动作业发送的电子邮件排入队列。作业运行时,它将使用deliver_now发送电子邮件。

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

method-i-deliver_later

基本上,deliver_later是异步的。使用此方法时,此时不会发送电子邮件,而是将其推送到作业的队列中。如果作业未运行,则不会发送电子邮件。无论工作状态如何,deliver_now都会立即发送电子邮件。 Here您可以看到交付方式的文档。

答案 2 :(得分:0)

这是因为您没有设置时间和轨道获取默认时间。并且在日志文件中还显示尚未调用deliver_later方法。

尝试使用:

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

然后在一分钟后检查日志。

答案 3 :(得分:0)

如果您使用的是delay_job,则必须运行rake jobs:work

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