使用Ruby on Rails,如何最好地安排发送电子邮件任务?

10

我想安排一个每天定时任务:每天早上7点发送一封电子邮件(无需人为干预)。

我正在使用RoR框架开发,并想知道最佳方法是什么?

我听说过BackgrounDRB、OpenWFEru调度器或基于Cron的工具,但作为新手,我不理解哪个适合我的需求。

5个回答

13

另一种选择是创建一个由定时任务运行的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


我在这方面遇到了一个奇怪的问题: 当我在命令行执行“cd /path/to/app && /usr/local/bin/rake send_daily_mail”时,它可以正常工作。但是当crontab尝试执行它时,我会收到错误消息:“/usr/local/bin/rake:9:in `require': No such file to load-- rubygems(LoadError)" from /usr/local/bin/rake:9" - Flackou
Cron任务默认情况下不会使用用户完整的登录环境。适用于我的crontab是:*/5 * * * * bash --login -c 'cd /path/to/app && rake send_daily_mail' - wonderfulthunk

7
I was impressed by (and plan to try) the rufus-scheduler gem discussed in this blog post.
他描述了类似于这样的东西:
scheduler = Rufus::Scheduler.start_new  

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

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


1
所以?你试过了吗?你觉得怎么样? - Dan Rosenstark

2

BackgroundRB是我使用的工具,它非常完美。我有多个电子邮件通过BackgroundRB发送和生成。我还有其他任务。因为它可以同时启用定时任务和异步任务(需要比普通的客户端/服务器响应周期更长的任务)。

我使用它并且非常满意。


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

现在切换到任何随机目录并运行该命令。如果它正常运行,请运行crontab -e并在其中设置每天早上7点运行的命令。如果你谷歌一下,关于cron格式的解释有很多,应该很容易弄清楚。


非常感谢您的回答。是否可以从特定的文件(如lib/tasks/send_mail.rb)中管理它,而不是在模型方法中处理? - Flackou

0

跟随接受的答案,使用 rake 任务和 cron 作业。但是,请注意更新cron文件本身是一项手动任务。如果您在开发过程中进行更改,则可能没事。否则,这里是如何让 Capistrano 为您执行该操作的:http://push.cx/2008/deploying-crontab-with-your-rails-app


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接