在ActionMailer中重新发送相同的电子邮件

时间:2013-07-06 15:45:44

标签: ruby-on-rails ruby ruby-on-rails-3 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))

然后将电子邮件发送给所有收件人。

所以我的问题是如何“重置”(或者说那样)电子邮件并再次发送?

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

1 个答案:

答案 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