我如何在heroku上使用delayed_job发送批量发送的电子邮件?

时间:2010-08-22 00:41:59

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

我阅读了有关workers和delayed_job的文档,并且无法完全遵循,所以想要了解一些策略和示例代码。

我有一个控制器,我用它来逐个发送电子邮件。现在我每天都想查看当天需要发送哪些电子邮件,然后通过heroku将它们作为delayed_job发送。

我如何开始接近这个?感谢。

这就是我根据答案提出的建议:

使用'when'gem,我创建了以下schedule.rb

  every 1.day, :at => '4:30 am' do

    heroku = Heroku::Client.new(ENV['HEROKU_USER'], ENV['HEROKU_PASS'])
    heroku.set_workers(ENV['HEROKU_APP'], 1)

    Contact.all.each do |contact|
      contact_email = contact.email_today

      unless contact.email_today == "none"
        puts contact.first_name
        puts contact_email.days
        puts contact.date_entered

        Delayed::Job.enqueue OutboundMailer.deliver_campaign_email(contact,contact_email)
      end

    end

    heroku.set_workers(ENV['HEROKU_APP'], 0)
  end

为了确定我是否应该立即发送电子邮件,我创建了contact.rb的方法:

  def email_today

    next_event_info = self.next_event_info # invokes method for contact

    next_event = next_event_info[:event]
    delay = next_event_info[:delay]

    if next_event.class.name == "Email" && from_today(self, next_event.days) + delay < 0 #helper from_today
      return next_event      
    else
      return "none"
    end

  end

这看起来不错吗?我正在开发Windows并部署到heroku所以不知道如何测试它...谢谢!

1 个答案:

答案 0 :(得分:3)

如果您每天发送一次电子邮件,您可能希望首先将cron addon添加到您的应用程序中,这将每天启动一次rake任务。

显然,您还需要添加delayed_job插件(http://docs.heroku.com/delayed-job)。此外,您的应用需要至少运行一名员工。

然后,这只是在您的cron rake任务中完成邮件工作的问题。例如,如果您有一个名为“UserMailer”的邮件程序,那么您的cron可能看起来像这样:

#lib/cron.rb
task :cron => :environment do
  User.all.each do |user|
    Delayed::Job.enqueue UserMailer.deliver_notification(user)
  end
end

如果您只使用后台任务发送这些电子邮件,您可以在cron任务中添加一些逻辑,并根据需要添加和删除工作人员的邮件方法,这将节省您必须为工作人员付费虽然它们没有被使用。