我需要发送大量的电子邮件。在这种情况下构建电子邮件是一项非常繁重的任务,所以我正在尝试缓存并重用它:
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))
然后将电子邮件发送给所有收件人。
所以我的问题是如何“重置”(或者说那样)电子邮件并再次发送?
ActionMailer版本为3.1.12
UPD
问题是电子邮件具有相同的“Message-ID”标题。在开发中我使用的是GMail,并不确切知道ActionMailer或GMail没有发送。目前我没有机会测试它。
无论如何,“Message-ID”不正确,所以我添加了add_message_id
为每封电子邮件生成新标题:
recipients.find_each do |user|
mail.add_message_id
mail.to = user.email
mail.deliver
end
也许有人会觉得有帮助,或者有人可以给出更明确的解释。
我没有尝试过Peer Allan的回答。但似乎它也可以解决,这就是我接受它的原因
答案 0 :(得分: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