2010-04-16 67 views
15

我希望能夠以確定的時間間隔向不同的收件人發送一串電子郵件。使用Ruby on Rails根據時間間隔發送電子郵件

我爲每個聯繫人分配了一系列稱爲Campaign的電子郵件,其中Campaign具有Email1,Email2等。每個聯繫人都有一個Contact.start_date。每個電子郵件都有email.days,它存儲自聯繫人開始發送電子郵件以來的天數。

例如:Email1.days = 5,Email2.days = 7,Email3.days = 11。

Contact1.start_date = 4/10/2010; contact2.start_date = 2010年4月8日

如果今天是4/15,則Contact1收到電子郵件1(4/15-4/10 = 5天) 如果今天是4/15,則Contact2收到電子郵件2 (4/15 - 4/8 = 7天)。

使用cron作業每天運行一個好的動作,然後遵循這些規則使用ActionMailer發送電子郵件?

注意:這個問題不是關於使用ActionMailer。這是關於做「數學」以及執行。哪些電子郵件發送給誰?我猜測它與日期 - 聯繫[x] .start_date的一些版本有關,然後與電子郵件[x]。日進行比較,但我不完全清楚如何。謝謝。

我想指導是否使用date.today和time.now。

注:意圖是個人可能需要安排個別後續行動的一致性基礎。與其不必記住何時跟蹤哪些電子郵件與誰一起,它只會遵循預先確定的活動併發送給該人。

所以這不是一個「大宗郵件」 - 它真正實現了個人通信的後續自動化。

+0

@Angela,您是否希望在Email#{n} .days'通過後,將這些電子郵件發送給每個聯繫人_every_'Email#{n} .days',或每個聯繫人只有_once_? 因爲我們一直在談論的解決方案(@Jens's)目前只有_once_。 – 2010-04-25 20:09:35

+0

是的,每個聯繫人只需要一次。因此,一個廣告系列包含Email1,Email2,Email3,每個都有自己的Emailn.days – Angela 2010-04-26 03:39:39

回答

14

我會用DelayedJob這個(假設你是不是發送大量電子郵件,郵件的日子,每天等即100的十萬)用耙子任務

class Email < ActiveRecord::Base 
    belongs_to :campaign 
    after_create :schedule_email_dispatch 

    def schedule_email_dispatch 
    send_at(campaign.created_at + self.days.days, :send_email) 
    end 

    def send_email 
    end 
end 

運行工:

rake jobs:work 

每次創建新的電子郵件對象時,延遲的作業項目都會添加到隊列中。在正確的時間間隔內,電子郵件將由工作人員發送。

@campaign = Compaign.new(...) 
@campaign.emails.build(:days => 1) 
@campaign.emails.build(:days => 2) 
@campaign.save # now the delay 

在上例中,保存活動後會創建兩個延遲的作業條目。它們在廣告系列創建日期後1天和2天執行。

該解決方案確保電子郵件大約在預期的計劃時間內發送。在一個基於cron作業的解決方案中,調度發生在cron間隔。預期的調度時間和實際的調度時間之間可能有幾個小時的延遲。

如果你想使用cron方法執行以下操作:

class Email < ActiveRecord::Base 
    def self.dispatch_emails 
    # find the emails due for dispatch 
    Email.all(:conditions => ["created_at <= DATE_SUB(?, INTERVAL days DAY)", 
      Time.now]).each do |email| 
     email.send_email 
    end 
    end 
end 

在此方案中,大部分的處理是由數據庫完成的。

添加email.rake文件lib/tasks目錄:

task :dispatch_emails => :environment do 
    Email.dispatch_emails 
end 

配置cron來執行定期rake dispatch_emails(在你的情況< 24小時)

+1

這是處理問題的一種很酷的方式。在創建時進行調度意味着您在嘗試確定需要運行的內容時不必擔心做數學運算。如果提問者不想使用DJ(爲了避免複雜性),他們仍然可以通過存儲電子郵件應該發送的日期來執行相同的技巧。但是,既然您已經具備了這項能力,我敢打賭,提問者將來會再次需要它,所以現在不妨付出代價。 不要忘了將「類型指示符」或其他內容傳遞給Email#build,以便知道要發送的電子郵件。希望我能做多個選票。 – Sixty4Bit 2010-04-21 16:28:18

+0

有趣的....所以當一個新的聯繫人被創建(每個聯繫人將被添加到未來與不同的date_entered日期)...我如何確保每個聯繫人在適當的間隔得到電子郵件。這不僅僅是具有不同時間間隔的電子郵件,還有聯繫人(收件人)。 – Angela 2010-04-23 00:53:07

+0

是的,略讀這一點,它看起來像是參考了活動日期,而不是單獨的聯繫日期......聯繫人將在成千上萬......每個人都有他們自己的日期(其中許多是一致的),但許多不。 – Angela 2010-04-23 00:54:28

1

我認爲這會更容易和更安全(您不必擔心身份驗證等問題)來創建rake任務來發送電子郵件。你也不必擔心可能會很長時間的運行請求。只要創建一個文件RAILS_ROOT/lib中/任務/ email.rake

namespace :email do 
    desc "Sends scheduled emails" 
    task :send_scheduled => :enviroment do 
    Email.send_scheduled_emails 
    end 
end 

和RAILS_ROOT /應用/ email.rb

class Email < ActiveRecord::Base  
    # ... 

    def self.send_scheduled_emails 
    #send your emails ... 
    end 
end 

然後創建一個cron作業

0 0 * * * user cd /your/rails/app/ && RAILS_ENV=production rake emais:send_scheduled 

送每天晚上12:00的電子郵件。

+0

已投票,因爲它沒有顯示如何確定何時發送每種類型的電子郵件。 – Sixty4Bit 2010-04-21 16:29:30

+0

右:我需要知道哪封電子郵件和何時發送......不同的聯繫人有不同的開始日期。我可以計算一個時間間隔,並提出間隔= 0的情況......但我必須遍歷每個聯繫人以及廣告系列中的所有活動。 – Angela 2010-04-23 00:49:50

6

我會創造在RAILS_ROOT/lib目錄rake任務/任務/ email.rake

namespace :email do 
    desc "send emails to contacts" 
    task :send do 
    Email.all.each do |email| 
     # if start_date is a datetime or timestamp column 
     contacts = Contact.all(:conditions => ["DATE(start_date) = ?", email.days.days.ago.to_date]) 
     # if start_date is a date column 
     contacts = Contact.all(:conditions => { :start_date => email.days.days.ago.to_date }) 
     contacts.each do |contact| 
     #code to send the email 
     end 
    end 
    end 
end 

然後我會用cronjob每天調用這個rake任務a牛逼3時三十分:

0 3 * * * app_user cd RAILS_APP_FOLDER && RAILS_ENV=production rake email:send 
+0

@Angela,它有你想要的日期比較計算。 'email.days' => 5,'5.days.ago.to_date' => 5天前的任何日期。 – 2010-04-22 13:43:34

+0

@Jens Fahnenbruck:':start_date,email.days.days.ago.to_date'應該是':start_date => email.days.days.ago.to_date' – 2010-04-22 13:44:12

+0

@Tim Snowhite ....啊,好的,我需要消化email.days.days.ago.to_date ...我可以在哪裏解析出來?我在email.days後迷路了.... – Angela 2010-04-23 00:51:14

1

我使用魯弗斯調度爲計劃的電子郵件和Twitter的更新。你應該檢查它。

相關問題