使用Delayed_Job发送电子邮件

时间:2016-10-13 17:23:05

标签: ruby-on-rails actionmailer delayed-job

我认为我的工作设置是通过QtConcurrent::run发送电子邮件。但是,我还没有收到我的测试电子邮件,等待更多的事情延迟几天是不切实际的。我需要弄清楚:

  1. 导致电子邮件无法发送的错误。
  2. 如何在不等待几天的情况下进行测试。
  3. 我是Delayed_Job的新手,所以请原谅新手的错误。

    这是包含Delayed_Job方法的模型。它们在没有send_reminder_emails位的情况下完全正常运行,所以至少我知道它有多大功能:

    .delay(run_at: self.mail_date)

    class Reminder < ActiveRecord::Base belongs_to :user before_save :create_mail_date after_save :send_reminder_emails extend FriendlyId friendly_id :name, use: [:slugged, :finders] def create_mail_date @schedule = IceCube::Schedule.new(self.date) case self.repeating when "Weekly" @schedule.add_recurrence_rule( IceCube::Rule.weekly ) when "Monthly" @schedule.add_recurrence_rule( IceCube::Rule.monthly.day_of_month(self.date.mon) ) when "Yearly" @schedule.add_recurrence_rule( IceCube::Rule.yearly.day_of_year(self.date.yday) ) end if self.repeating self.date = @schedule.next_occurrence(Time.now) end self.mail_date = self.date - 7.days end private def send_reminder_emails if self.reminder ReminderMailer.delay(run_at: self.mail_date).reminder_send(self.user, self).deliver_now self.create_mail_date end end handle_asynchronously :send_reminder_emails end 的引用是通过schedule gem进行的,并且所有日期内容都已通过我的控制台进行测试并且正在运行。这是我的Ice_Cube

    reminder_mailer.rb

    我从他们的Rails 4自述文件中逐步安装了class ReminderMailer < ApplicationMailer default from: "man@manlyartofbbq.com" def reminder_send(user, reminder) @user = user @reminder = reminder mail(to: user.email, subject: "Reminder! #{reminder.name} is fast approaching!") end end 。任何有助于让这封邮件的延迟部分得到解决的帮助表示赞赏!

3 个答案:

答案 0 :(得分:8)

您可以通过在特定时间安排作业来使用活动作业发送邮件。

Active Job是一个框架,用于声明作业并使它们在各种排队后端上运行。这些工作可以是定期清理,计费和邮寄等各种工作。任何可以切成小工作单元并且并行运行的东西,真的。

要在生产中排队和执行作业,您需要设置排队后端,也就是说您需要决定Rails应该使用的第三方排队库。 Rails本身只提供一个进程中的排队系统,它只将作业保存在RAM中。如果进程崩溃或计算机重置,则使用默认的异步后端丢失所有未完成的作业。这可能适用于较小的应用程序或非关键作业,但大多数生产应用程序需要选择持久的后端。

Active Job具有用于多个排队后端的内置适配器(Sidekiq,Resque,Delayed Job等)。要获取适配器的最新列表,请参阅ActiveJob::QueueAdapters.

的API文档

配置排队适配器后,再创建用于发送邮件的作业

class RemainderMailerJob < ApplicationJob
  queue_as :default

  def perform(user, remainder)
   ReminderMailer.reminder_send(user, reminder).deliver
  end
end

要在特定时间发送邮件,您需要将作业排入队列并使其在特定时间执行。如果您需要在7天后发送邮件,请在需要的地方拨打这段代码。

RemainderMailerJob.set(wait: 1.week).perform_later(user, remainder)

现在这个工作将在1周后执行,然后在那个时间调用邮件,这样你的邮件就会在特定日期发送。

如果您知道具体的日期时间,则可以使用

RemainderMailerJob.set(wait_untill: <Specific date>).perform_later(user, remainder)

如果您对有效工作有任何疑问,请参阅Active Job Basics

答案 1 :(得分:4)

使用延迟作业发送邮件时,在初始化邮件的delayed_job时无需添加“deliver”或“deliver_now”。所以

ReminderMailer.delay(run_at: self.mail_date).reminder_send(self.user, self)

本身会起作用。

将'self.mail_date'转换为还包括您要发送邮件的时间。仅传递日期不起作用。基本上run_at应该指定日期和时间。

请检查“Rails 3 Mailers”标题下的'delayed_job'github链接 https://github.com/collectiveidea/delayed_job

答案 2 :(得分:0)

我已经看到在属性保护配置错误时会发生这种情况。 (通常在遗留应用程序中,在升级rails版本时会留下一些损失。)

查看您是否能够从控制台设置字段:Delayed::Job.new(run_at: 1.year.from_now)。如果没有,那就是罪魁祸首,你需要在应用程序中找出原因。

如果有效,那么我们仍然需要验证这是应用程序问题还是DJ错误。使用delayed_job表创建一个新的最小轨道应用程序,并尝试重现这一点。如果你不能,你的应用程序中还有其他奇怪的东西。