2011-02-16 37 views
1


我想发送简讯给所有注册用户,但只有最后一个用户(数据库)接收邮件。Rails 3的邮件给用户

def letter(nletter) 
    @nletter = nletter 
    @users=Newsletter.all 
    @users.each do |users| 
    mail(:to => users.email, :subject => @nletter.subject) 
    end 
    end 

什么问题?

回答

3

如果您向我们展示的代码是在你的邮件程序类,它是因为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 

希望这有助于!

+1

只是一个侧面说明,如果你发送了一个通用的邮件,你应该把用户的电子邮件地址的阵列中的BCC字段,因此电子邮件地址不要让彼此共享。 – 2012-08-08 18:14:50