2009-02-16 41 views
10

我想安排每日任务:每天早上7点,我想要发送一封电子邮件(无需人工干预)。使用Ruby on Rails安排发送电子邮件任务的最佳方式是什么?

我正在研究RoR框架,我想知道什么是最好的方法来做到这一点?

我听说过BackgrounDRB,OpenWFEru调度程序或基于Cron的东西,但我是一个新手,不明白哪一个是为我的需要而设计的。

回答

12

另一种选择是创建一个由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 

请注意,如果您的应用程序默认处于开发模式,您可能需要将RAILS_ENV=production放在您的crontab中。

+0

我有一个奇怪的问题: 当我从命令行执行“cd/path/to/app &&/usr/local/bin/rake send_daily_mail”时,它可以工作。但是,当crontab尝试执行它时,我在`require'中有'/ usr/local/bin/rake:9'错误:无需加载此文件 - 来自/ usr/local/bin/rake的rubygems(LoadError) :9“ – Flackou 2009-02-17 10:52:33

1

将一个类方法添加到您的模型之一,将为您处理这个。现在尝试使用亚军脚本执行该方法

./script/runner "MyModel.send_daily_mail" RAILS_ENV=production 

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

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

现在转到任何随机directiry并运行该命令。如果运行正常,请运行crontab -e并在该设置中插入该命令,以在每日上午7点运行。关于那里的cron格式有很多的解释,如果你是谷歌的,并且应该很容易弄清楚。

+0

非常感谢你的回答。是否有可能从特定的文件(如lib/tasks/send_mail.rb)而不是在模型的方法中进行管理? – Flackou 2009-02-16 16:02:13

7

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

他描述是这样的:

scheduler = Rufus::Scheduler.start_new 

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

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

+1

是吗?你试过了,你觉得怎么样? – 2010-05-07 17:41:13

2

BackgroundRB是我使用的,它的工作原理非常完美。我有几封电子邮件正在发送,由BackgroundRB生成。我也有其他的任务。因为它启用了计划任务和异步任务(比普通客户机/服务器响应周期花费的时间更长的任务)。

我使用它,我很满意它。

0

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

相关问题