我正在试图弄清楚是否可以使用没有Rails的ActionMailer来渲染一次html.erb视图,然后使用不同的电子邮件多次发送出来:到?
注意:我没有使用完整的Rails堆栈,只是ActionMailer
所以在邮件程序类中
class MyMailer < ActionMailer::Base
default :from => 'johndoe@example.com',
:subject => 'New Arrivals!'
def new_products(customer, new_products)
@new_products = new_products
mail :to => customer.email do |format|
format.html
end
end
end
然后,在客户端代码中,我们需要获得新产品和客户。
products = Product.new_since_yesterday
customers = Customer.all
customers.each do |c|
MyMailer.new_products(c, products).deliver
end
我们说这是每天发送一次,所以我们只想在上次发送电子邮件后获得新产品。我们只想渲染一次,因为今天的新产品不会在电子邮件之间发生变化。据我所知,这将在每次创建和发送电子邮件时调用渲染。
有没有办法告诉ActionMailer只渲染一次,然后以某种方式引用包含渲染视图的对象。这将减少渲染执行它所需的所有时间。发送到的电子邮件地址会发生变化,但电子邮件的内容不会发生变化。
显然,对于大量电子邮件,您不会简单地遍历列表并创建/发送电子邮件。您可以使用队列。一般来说,当没有必要多次生成渲染步骤时,你会怎么做一次并将结果用于所有电子邮件?
可能我对ActionMailer的不熟悉让我失望。
答案 0 :(得分:2)
我还没试过这个,但是对邮件程序的调用只返回一个普通的Mail :: Message对象,并带有一个正文。所以你应该能够抓住身体并重新使用它。
message = MyMailer.new_products(c, products)
message_body = message.body
customers.each do |c|
mail = Mail.new do
from 'yoursite@sample.com'
to c.email
subject 'this is an email'
body message_body
end
mail.deliver
end
您甚至可以通过复制消息来提高效率
message = MyMailer.new_products(c, products)
customers.each do |c|
mail = message.dupe()
mail.to = c.email
mail.deliver
end