使用Delayed_Job发送电子邮件

Liz*_*Liz 6 ruby-on-rails actionmailer delayed-job

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

  1. 导致电子邮件不发送的错误是什么.
  2. 如何在不等待几天的情况下进行测试.

我是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
Run Code Online (Sandbox Code Playgroud)

引用schedule是通过Ice_Cubegem和所有日期的东西已经通过我的控制台测试,并正在工作.这是我的reminder_mailer.rb:

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
Run Code Online (Sandbox Code Playgroud)

Delayed_Job从他们自己的Rails 4自述文件中逐步安装.任何帮助让这个邮件的延迟部分得到解决,这是值得赞赏的!

Bal*_*hik 9

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

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
Run Code Online (Sandbox Code Playgroud)

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

RemainderMailerJob.set(wait: 1.week).perform_later(user, remainder)
Run Code Online (Sandbox Code Playgroud)

现在这个Job将在1周后执行,然后在那个时间调用邮件程序,所以你的邮件将在特定日期发送.

如果你知道特定的日期时间,那么你可以使用

RemainderMailerJob.set(wait_untill: <Specific date>).perform_later(user, remainder)
Run Code Online (Sandbox Code Playgroud)

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


Sha*_*das 4

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

ReminderMailer.delay(run_at: self.mail_date).reminder_send(self.user, self)
Run Code Online (Sandbox Code Playgroud)

本身会起作用。

将您的“self.mail_date”转换为还包括您要发送邮件的时间。仅传递日期是行不通的。基本上 run_at 应该指定日期和时间。

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