0

我需要发送大量电子邮件。在这种情况下构建电子邮件是一项艰巨的任务,因此我正在尝试缓存和重用它:

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 的回答。但似乎它也可以成为解决方案,这就是我接受它的原因

4

1 回答 1

0

假设不需要为每个收件人更改电子邮件中的数据,您可以尝试在不使用模板的情况下发送电子邮件。

# 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

于 2013-07-06T20:32:51.323 回答