Rails 5:ActionMailer 的“deliver_later”永远不会在生产中交付

Posted

技术标签:

【中文标题】Rails 5:ActionMailer 的“deliver_later”永远不会在生产中交付【英文标题】:Rails 5: ActionMailer's "deliver_later" never delivers in production 【发布时间】:2018-06-30 01:11:08 【问题描述】:

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

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"

我知道 ActionJob 在我使用 Deliver_later 时正在处理它,根据 docs:

Active Job 的默认行为是通过 :async 执行作业 适配器。因此,您现在可以使用 Deliver_later 发送电子邮件 异步。 Active Job 的默认适配器运行带有 进程内线程池。它非常适合开发/测试 环境,因为它不需要任何外部基础设施, 但它不适合生产,因为它会丢弃待处理的工作 重新开始。如果你需要一个持久的后端,你需要使用一个 具有持久后端(Sidekiq、Resque、 等)。

此时,我不需要持久后端,使用进程内线程池就可以了。有没有什么方法可以让我在不引入 Sidekiq + Redis 的外部基础设施的情况下使用 Deliver_later?

【问题讨论】:

【参考方案1】:

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

尝试内联,或使用 Deliver_now

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

使用来自 Rake 任务的异步队列(例如,使用 .deliver_later 发送电子邮件)通常不起作用,因为 Rake 可能会在任何/所有.deliver_later 电子邮件被处理。为避免此问题,请使用 .deliver_now 或在开发中运行持久队列。

【讨论】:

啊,谢谢。假设这是有道理的。我将只使用 Deliver_now。

以上是关于Rails 5:ActionMailer 的“deliver_later”永远不会在生产中交付的主要内容,如果未能解决你的问题,请参考以下文章

通过电子邮件发送ActionMailer中的当前用户 - Rails 5

Rails 中 ActionMailer Mandrill 的问题

在 Rails3 / ActionMailer 中设置 Message-ID 邮件头

Rails - 你如何测试 ActionMailer 在测试中发送了特定的电子邮件

Rails ActionMailer 用户邮件发送器 无方法

ActionMailer 在开发 Rails 4 中不发送邮件