2012-01-19 82 views
3

我不僅是新的Rails,但一般的發展,所以我很抱歉,如果這是一個基本問題。我有一個應用程序,我想發送大量電子郵件(即通訊)給選擇加入的用戶。我有兩個問題:(1)我的代碼是處理羣發郵件的最有效方式(即,我是否需要使用for ... each statement)和(2)我閱讀Stack Overflow上的其他帖子,談論重要性的郵件服務器並使用延遲作業發送電子郵件。羣發電子郵件與Rails 3

其他注意事項:

  • 我在Heroku
  • 我想使用SendGrid
  • 我加延遲職位代碼基於this tutorial

我的問題是:

  1. 大多數p人們甚至對單個收件人的電子郵件使用延遲工作(即用戶註冊確認)?
  2. 我的代碼是做羣發郵件最有效的方法嗎?
  3. 例如,如果有1000個用戶。如果我向每個人發送與BCC相同的電子郵件,它是否會在資源(即帶寬,CPU等)方面產生巨大差異?如果是這樣,我只是傳遞一個散列到郵件程序(即刪除for ... each並將opt_in_user參數更改爲@opt_in_users)並將收件人更改爲bcc?

謝謝!

控制器

commmunity_users = UserCommunityRelation.find('community_id = ? and status = ?,'  current_community, "approved") 
@opt_in_users = User.find('opt_in = ?,' true) 

@opt_in_users.each do |opt_in_user| 
    UserMailer.send_later(:deliver_announcement, opt_in_user) 
end  

UserMailer.rb

def announcement(opt_in_user) 
    mail(:to => "#{opt_in_user.username} <#{opt_in_user.email}>", :subject => "Huge Announcement!") 
end 

回答

2

對於批量發送,你一定要通過服務(我們使用的郵筒,SendGrid是另一種選擇)發送。除了服務器上的負載之外,服務還可能更適合反彈,垃圾郵件攔截等,它可能會提供額外的好處,如跟蹤。

即使是單個收件人的電子郵件(即用戶註冊確認),大多數人是否也使用延遲工作?

對於單用戶電子郵件,我會在控制器中直接發送電子郵件。

我的代碼是做羣發郵件最有效的方法嗎?

您不想讓控制器操作管理排隊任務,因爲這會影響您的站點響應能力。使用cron作業和rake任務在後臺執行它。

例如,如果有1000個用戶。如果我向每個人發送與BCC相同的電子郵件,它是否會在資源(即帶寬,CPU等)方面產生巨大差異?如果是這樣,我只是傳遞一個散列到郵件程序(即刪除for ... each並將opt_in_user參數更改爲@opt_in_users)並將收件人更改爲bcc?

我認爲BCC是對資源的使用情況很好,但你的服務器將與任何反彈被擊中,這是一個額外的服務來管理,因此,我會用服務去如前所述

順便說一句,對於每個問題#each vs ...,迭代器的成本將會非常低,以至於不值得考慮IMO。

+1

我仍然會使用SendGrid甚至是一次性的電子郵件。其次,更好的交付,主要是分析。 – 2012-01-19 00:33:09

+1

另外,您希望儘可能使用延遲作業,因爲您正在與外部服務進行交互,並且您不知道需要多長時間處理 - 讓它在後臺進行並將控制權交還給用戶。 – 2012-01-19 07:33:19