我需要发送大量电子邮件。在这种情况下构建电子邮件是一项艰巨的任务,因此我正在尝试缓存和重用它:
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
同样的结果。只是为了检查这个假设而不是 dup 我试过:
m = Marshal.load(Marshal.dump(mail))
然后将电子邮件发送给所有收件人。
所以我的问题是如何“重置”(或类似的)电子邮件并再次发送?
ActionMailer 版本是 3.1.12
UPD
问题是电子邮件具有相同的“Message-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 的回答。但似乎它也可以成为解决方案,这就是我接受它的原因