ruby-on-rails – 使用Ruby on Rails发送基于间隔的电子邮件

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 使用Ruby on Rails发送基于间隔的电子邮件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想能够以确定的间隔向不同的收件人发送一串电子邮件.

我分配给每个联系人这一系列电子邮件称为广告系列,其中Campaign有Email1,Email2等.每个联系人都有一个Contact.start_date.每个电子邮件都有email.days,其中存储自联系人的起始日期以发送电子邮件的天数.

例如:Email1.days = 5,Email2.days = 7,Email3.days = 11.

Contact1.start_date = 4/10/2010; contact2.start_date = 4/08/2010

IF今天是4/15,然后Contact1收到电子邮件1(4 / 15-4 / 10 = 5天)
IF今天是4/15,然后Contact2收到电子邮件2(4/15 – 4/8 = 7天).

使用cron工作每天运行一个好的动作,然后按照这些规则使用ActionMailer发送电子邮件

注意:问题不在于使用ActionMailer.它是关于做“数学”以及执行.哪些电子邮件发送给谁?我猜测它与某些版本的Date – Contact [x] .start_date有关,然后与电子邮件[x] .days进行比较,但我不完全清楚如何.谢谢.

我想指导是否使用date.today与time.now以及.

注意:意图是个人可能需要在一致的基础上安排个人跟进.而不必记得什么时候跟踪哪些电子邮件与谁,只是按照预定的活动并发送给那个人.

所以这不是一个“大邮件” – 它真的是使个人信件的后续自动化.

解决方法

我会使用 DelayedJob这个(假设你不是每天都发送大量的电子邮件电子邮件,也就是每天数千个等等)
class Email < ActiveRecord::Base
  belongs_to :campaign
  after_create :schedule_email_dispatch

  def schedule_email_dispatch
    send_at(campaign.created_at + self.days.days,:send_email)
  end

  def send_email
  end
end

使用耙子任务运行工人:

rake jobs:work

每次创建一个新的电子邮件对象时,将延迟的作业项目添加到队列中.在正确的时间间隔内,电子邮件将由工作人员发送.

@campaign = Compaign.new(...)
@campaign.emails.build(:days => 1)
@campaign.emails.build(:days => 2)
@campaign.save # now the delay

在上面的示例中,保存广告系列后将创建两个延迟作业条目.他们在广告系列创作日期后1和2天执行.

解决方案确保电子邮件大约在预期安排时间周围发送.在一个基于Cron工作的解决方案中,在cron间隔发生disapaching.在预定的调度时间和实际调度时间之间可能有几个小时的延迟.

如果要使用cron方法,请执行以下操作:

class Email < ActiveRecord::Base
  def self.dispatch_emails
    # find the emails due for dispatch
    Email.all(:conditions => ["created_at <= DATE_SUB(?,INTERVAL days DAY)",Time.now]).each do |email|
      email.send_email
    end
  end
end

在这个解决方案中,大部分的处理是由DB完成的.

在lib / tasks目录中添加email.rake文件

task :dispatch_emails => :environment do
  Email.dispatch_emails
end

配置cron以定期执行rake dispatch_emails(在您的情况下(< 24小时))

猜你在找的Ruby相关文章