2013-07-06 70 views
0

我需要發送大量的電子郵件。在這種情況下建立的電子郵件是相當繁重的任務,所以我想緩存和重用:在ActionMailer中重新發送相同的電子郵件

mail = Rails.cache.fetch("newsletters/#{newsletter.id}") do 
    NewsletterMailer.products(newsletter) 
end 

recipients.find_each do |user| 
    mail.to = user.email 
    mail.deliver 
end 

但有了這個代碼僅第一收件人收到郵件。似乎相同的電子郵件不能發送一次以上。比我試圖重複它:

recipients.find_each do |user| 
    m = mail.dup 
    m.to = user.email 
    m.deliver 
end 

結果相同。只是爲了檢查這個假設,而不是重複我試過:

m = Marshal.load(Marshal.dump(mail)) 

然後電子郵件傳遞給所有收件人。

所以我的問題是如何「重置」(或像這樣的smth)電子郵件,並再次發送?

的ActionMailer版本是3.1.12

UPD

問題是,郵件有相同的 '郵件ID' 標頭。在開發過程中,我使用的是GMail,並不確切知道ActionMailer或GMail沒有發送。目前我沒有機會測試它。 反正相同的「郵件ID」不正確,所以我加了add_message_id生成每個電子郵件新標題:

recipients.find_each do |user| 
    mail.add_message_id 
    mail.to = user.email 
    mail.deliver 
end 

也許有人會發現它的幫助還是有人可以給出一個更清楚的解釋。

我還沒有試過Peer Allan的答案。但它似乎也可以是解決方案,這就是爲什麼我接受它

回答

0

假設電子郵件中的數據不需要更改每個收件人,您可以嘗試發送電子郵件without using templates

# determine a way to get the email body into a string 
email_body = NewsletterMailGenerator.generate_email(newsletter) 

recipients.find_each do |user| 
    NewsletterMailer.products(user.email, email_body).deliver 
end 

class NewsletterMailer < ActionMailer::Base 
    def products(user, email_body) 
    mail(to: user, 
     body: email_body, 
     content_type: "text/html", 
     subject: "Already rendered!") 
    end 
end 

樣品郵寄代碼是從這裏http://guides.rubyonrails.org/action_mailer_basics.html#sending-emails-without-template-rendering

+0

我更新的問題 –

相關問題