2013-07-06 3 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)) 

Затем электронное письмо доставляется всем получателям.

Таким образом, мой вопрос заключается в том, как можно «переустановить» (или что-то подобное) и отправить его еще раз?

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

Предполагая, что данные в электронной почте не должны меняться для каждого получателя, вы можете попробовать отправить электронное письмо 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

Я обновил вопрос –

Смежные вопросы