2009-02-16 39 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

相關問題