如果您向我们展示的代码是在你的邮件程序类,它是因为mail
方法只设置了一个邮件对象的各种属性。当你遍历所有用户,并呼吁mail
为每一个,你只是重置单邮件对象的主题和(更重要的)接收者。因此,当函数完成并发送邮件时,当前收件人是您设置它的最后一个用户 - 数据库中的最后一个用户。
你可以通过两种不同的方式解决这个问题。如果它是一个通用的电子邮件(每个人都得到相同的确切消息),你可以通过电子邮件地址数组作为:to
:
注:随着约什在评论中指出的,你会很总是希望使用:bcc
而不是:to
,因此您最终不会播出您的整个邮件列表。
def letter(nletter)
@nletter = nletter
@users=Newsletter.all
mail(:to => @users.map(&:email), :subject => @nletter.subject)
end
但是,如果每个用户得到一个自定义电子邮件("Hi, #{username}!"
或诸如此类),你必须为每个用户创建一个新的邮件对象。你可以通过调用Mailer.deliver_letter(nletter, user)
为每个用户做到这一点:
# Somewhere outside of your Mailer:
nletter = "...whatever..."
Newsletter.all.each do |user|
Mailer.deliver_letter(nletter, user)
end
# And your mailer function would look like:
def letter(nletter, user)
@nletter = nletter
mail(:to => user.email, :subject => @nletter.subject)
end
希望这有助于!
只是一个侧面说明,如果你发送了一个通用的邮件,你应该把用户的电子邮件地址的阵列中的BCC字段,因此电子邮件地址不要让彼此共享。 – 2012-08-08 18:14:50