Rails 5:ActionMailer 的 "deliver_later" 在生产环境中从未交付

3

我有一个非常基本的邮件发送设置,如下所示,用于发送交易邮件:

class PayoutMailer < ApplicationMailer
  default from: 'hello@groundworkai.com'

  def payout_success_email(email, payment_size, user_name)
    @payment_size = payment_size
    @user_name = user_name
    subject = 'Your Rewards Have Been Sent!'
    mail(to: email, from: 'hello@myservice.com', subject: subject)
  end
end

“我正在测试这行代码:”
PayoutMailer.payout_success_email('test@example.com',
                                          200000,
                                          'test name').deliver_later

我的问题是,当我使用 .deliver 或 .deliver_now 时,邮件可以发送,但是当我异步委派它使用 deliver_later 时,它被排队了但从未发送。输出如下:

I, [2018-01-20T15:27:44.140104 #4]  INFO -- : [ActiveJob] Enqueued ActionMailer::DeliveryJob (Job ID: 265cb31a-dec4-4adb-866d-06e44645c53a) to Async(mailers) with arguments: "PayoutMailer", "payout_success_email", "deliver_now", "test@example.com", 200000, "test name"

根据文档,当使用deliver_later时,ActionJob会处理它:

Active Job的默认行为是通过: async适配器执行作业。因此,您现在可以使用deliver_later异步发送电子邮件。Active Job的默认适配器使用进程内线程池运行作业。它非常适合开发/测试环境,因为它不需要任何外部基础结构,但是对于生产环境来说不太合适,因为它会在重新启动时删除挂起的作业。如果您需要一个持久性后端,则需要使用具有持久性后端的Active Job适配器(Sidekiq、Resque等)。

目前,我不需要一个持久性后端,并且使用进程内线程池也没有问题。是否有办法在不引入Sidekiq + Redis的外部基础设施的情况下使用deliver_later?

1个回答

10

在rake任务中异步适配器无法工作。

尝试使用内联方式,或使用deliver_now。

来自 http://edgeguides.rubyonrails.org/active_job_basics.html#job-execution

从Rake任务中使用异步队列(例如,使用.deliver_later发送电子邮件)通常不起作用,因为Rake很可能会结束,在处理任何/所有.deliver_later电子邮件之前删除进程线程池。为避免此问题,请使用.deliver_now或在开发中运行持久队列。


啊,谢谢。那应该是有道理的。我会使用deliver_now的。 - nao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接