使用Ruby on Rails安排发送电子邮件任务的最佳方法是什么?

时间:2009-02-16 15:22:30

标签: ruby-on-rails scheduling scheduled-tasks

我想安排一项日常任务:每天早上7点,我都希望发送一封电子邮件(无人为干预)。

我正在研究RoR框架,我想知道最好的方法是什么?

我听说过BackgrounDRB,OpenWFEru调度程序或基于Cron的事情,但我是新手,不明白哪一个是为我的需要而制作的。

5 个答案:

答案 0 :(得分:13)

另一种选择是创建由cron作业运行的rake任务。 为此,请创建一个文件some_file.rake并将其放在lib/tasks文件夹中。您的文件可能如下所示:

Rails 2.x:

task :send_daily_mail, :needs => :environment do
    Model.send_daily_mail
end

Rails 3.x:

task :send_daily_mail => :environment do
    Model.send_daily_mail
end

然后使用cron随意执行它:

cd /path/to/app && /usr/bin/rake send_daily_mail

请注意,如果您的应用默认处于开发模式,则可能需要在您的crontab中添加RAILS_ENV=production

答案 1 :(得分:7)

rufus-scheduler所讨论的in this blog post宝石给我留下了深刻印象(并计划尝试)

他描述了这样的事情:

scheduler = Rufus::Scheduler.start_new  

scheduler.every("1m") do  
   DailyDigest.send_digest!  
end 

..这看起来很简单。我想知道添加基于HTML的配置有多容易吗?

答案 2 :(得分:2)

BackgroundRB是我使用的,它完美无缺。我发送了几封由BackgroundRB生成的电子邮件。我也有其他任务。因为它支持计划任务和异步任务(比正常客户端/服务器响应周期更长的任务)。

我使用它,我对它非常满意。

答案 3 :(得分:1)

将类方法添加到您将为您处理此问题的模型之一。现在尝试使用runner脚本

执行该方法
./script/runner "MyModel.send_daily_mail" RAILS_ENV=production

确保一切正常。如果确实如此,那么我们需要通过正确设置项目路径来使命令普遍适用。

cd /path/to/my/rails/project && ./script/runner "MyModel.send_daily_mail" RAILS_ENV=production

现在更改为任何随机方向并运行该命令。如果它正常运行,请运行crontab -e并在该设置中插入命令,以便每天早上7点运行。如果你谷歌的话,那里有关于cron格式的大量解释,应该很容易理解。

答案 4 :(得分:0)

使用rake任务和cron作业,正如已接受的答案已经说明的那样。但请注意,更新cron文件本身是一项手动任务。如果您在开发过程中没有更改它,那可能没问题。否则,在这里你可以让Capistrano为你做这件事:http://push.cx/2008/deploying-crontab-with-your-rails-app