Rails 在 AWS 上使用 deliver_later 的 Action Mailer

Rails Action Mailer with deliver_later on 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] Enqueued ActionMailer::DeliveryJob (Job ID: d7114-464e-4a90-9721-126650) to Async(mailers) with arguments: "UserMailer", "welcome_email", "deliver_now", #>

如有任何帮助,我们将不胜感激。谢谢。

您使用的是什么 ActiveJob 后端?

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

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

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

尝试使用:

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

然后一分钟后查看日志。

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

如果您使用 deliver_later,则必须使用像 Sidekiq 这样的 ActiveJob 运行程序,您可以看到已发送此 gist Sending emails with ActionMailer and Sidekiq also see this for basic Sidekiq 电子邮件。

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

发送电子邮件
UserMailer.welcome_email(self).deliver_later(wait: 1.hour)

method-i-deliver_later

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

如果您使用 delayed_job,则必须 运行 rake jobs:work

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