2013-08-19 111 views
2

有人能幫我理解如何發送電子郵件給我的網站的所有用戶嗎?如果用戶註冊或提交聯繫表單或執行某些操作,我知道如何創建電子郵件。但是,我不知道如何發送電子郵件,而無需執行某些操作。在Rails中發送電子郵件通訊/調查

在我的配置/環境/ production.rb我:

config.action_mailer.smtp_settings = { 
    :address    => "smtp.mandrillapp.com", 
    :port     => 587, 
    :domain    => "majorfinder.com", 
    :user_name   => ENV["MANDRILL_USERNAME"], 
    :password    => ENV["MANDRILL_PASSWORD"], 
    :authentication  => :plain, 
    :enable_starttls_auto => true 
} 

config.action_mailer.default_url_options = { 
    :host => "majorfinder.com" 
} 

在我的應用程序/郵寄/ questions_mailer.rb我:

class QuestionsMailer < ActionMailer::Base 
    default from: "[email protected]" 
    def interest_question(user) 
    @user = user 
mail(to: @user.email, subject: "My Subject") 
    end 

我的TXT和HTML版本我的電子郵件已創建並放置在app/views/questions_mailer/email.html.erb/email.txt.erb中。

我錯過了什麼,我放在我的控制器,使電子郵件發送。是這樣的:

QuestionsMailer.interest_question(@user).deliver 

在發送這個時,我有大約300用戶。我應該把它分成多個批次(就像我在這裏找到的:Sending emails based on intervals using Ruby on Rails)?

我不知道這是否重要,但我託管在heroku上,我的數據庫是postgresql。

非常感謝你給我的任何幫助!

更新: 我跟着@ jefflunt的建議並創建了一個rake任務。這是我的樣子:

desc "Email to ask users what they're most interested in" 
task :interests => :environment do 
    User.all.each do |u| 
    QuestionsMailer.interest_question(u).deliver 
    end 
end 

然後我在本地運行rake interests以確保一切正常。一旦我將所有更改推送到heroku,我就運行了heroku run rake interests,並向所有用戶發送了一封電子郵件。

回答

3

創建一個rake任務,該任務遍歷站點上活動用戶的所有電子郵件地址,爲每個用戶構建和發送一封電子郵件。

喜歡的東西:

namespace :transactional_emails do 
    desc "Email to ask users what they're interested in" 
    task :interests => :environment do 
    User.all.each |u| do 
     QuestionsMailer.interest_question(u).deliver 
    end 
    end 
end 

我不認爲成批發送,除非任務完全吸收了你的CPU或佔用更多的內存比你可以在你的應用服務器上做足這一點很重要。對您的數據庫性能影響不大可能不會太大。

加載:environment可能是必需的(它基本上會加載您的Rails應用程序),以便您的連接設置到您的數據庫以及從config/environments/production.rb加載您的ActionMailer配置。當你在rake任務中加載環境時,應用程序中的大部分內容都應該可以訪問,包括所有模型等。

一些注意事項:

  1. 加載環境是指啓動時間爲你的任務會比如果沒有加載環境的時間,但它可能是排除你的環境,因爲一個選項這就是您的SMTP設置存儲的位置。
  2. 對於超過300名用戶,此任務可能需要一段時間才能運行,因此請確保以這種方式運行該任務,以便在完成日誌時需要很長時間才能記錄成功/失敗,以便您可以在某處重新啓動任務在列表中間,如果作業被殺死或者其他事情中斷了電子郵件傳送。如果只有10%的用戶沒有第一次收到電子郵件,那麼您不想要做的就是重新發送到整個列表。我建議不要採用批量方法,主要是因爲它會增加應用程序的複雜性並導致某些定期作業,除非您可以測量對應用程序的真實有害影響,否則不需要隨着時間推移分發這些工作。進行大量SMTP連接時,應用程序服務器上的大部分負載將成爲到您的SMTP服務器的網絡連接 - 因此可能不是什麼大不了的事情。
  3. rake如果您希望將用戶的子列表,自定義主題行或其他有用信息傳遞到任務中,任務可以接受命令行參數。假設您以某種方式將您的用戶分爲User::active?,User.veteran?User.recently_joined?,其中.active?用戶是在過去30天內登錄的用戶,.veteran?用戶是在您的網站上至少一年的用戶,而recently_joined?用戶是在過去30天內創建帳戶的人。傳遞東西像在命令行:

    bundle exec rake user_email SEGMENT=veterans

...可能是一種方式來有條件地發送電子郵件到一些子集您的整個用戶羣。

書寫自定義rake任務是covered here

發送電子郵件以提高避免垃圾郵件過濾器的可能性時,可能需要考慮的因素可能是read here

+0

非常感謝你@jefflunt!耙子任務完美運作。 – lflores

+0

甜。會非常尷尬的,它沒有奏效。 :) – jefflunt

+0

我不能相信這沒有更多upvotes – Abram

相關問題