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

2024-05-07

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

class PayoutMailer < ApplicationMailer
  default from: '[email protected] /cdn-cgi/l/email-protection'

  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: '[email protected] /cdn-cgi/l/email-protection', subject: subject)
  end
end

我正在用这一行测试:

PayoutMailer.payout_success_email('[email protected] /cdn-cgi/l/email-protection',
                                          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", "[email protected] /cdn-cgi/l/email-protection", 200000, "test name"

我知道当我使用 Deliver_later 时 ActionJob 正在处理它,按照docs http://guides.rubyonrails.org/action_mailer_basics.html:

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

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


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

尝试内联,或者使用 Deliver_now

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 5:ActionMailer 的“deliver_later”从未在生产环境中交付 的相关文章

随机推荐