在一个交付命令中发送多个邮件?

时间:2011-09-09 08:13:19

标签: ruby-on-rails arrays email actionmailer

我尝试在一个.deliver命令中发送多封邮件。我的邮件程序方法如下:

def feedback_mail
    @verteiler = ["foo@bar.com", "bar@foo.com"]
    for v in @verteiler.sort
      mail(:to => v, :subject => "Foo Bar")
    end
end

问题是,只有一封邮件被发送到数组的最后一个条目。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

这个想法不会扩展太多 - 你需要实现类似Resque和工作人员的工作来处理发送所有电子邮件。

是的,@ socjopata的想法很好,但你真的想迭代将它们添加到作业队列并产生几个工人来处理它们。根据指南,这是如何做到的:

class AdminMailer < ActionMailer::Base
  default :to => ["foo@bar.com", "bar@foo.com"],
          :from => "notification@example.com"

  def new_registration(user)
    @user = user
    mail(:subject => "New User Signup: #{@user.email}")
  end
end

我基本上将YourMailer.feedback_mail(<PASS ARGS HERE>).deliver交给Resque -

Resque.enqueue(SendMail, <ARGS>)  # replace this in your controller

工人看起来像

#send_mail.rb
class SendMail
  @queue = :feedback_mail_queue
  def self.perform(<ARGS>) # pass these in enqueue call
    YourMailer.feedback_mail(<PASS ARGS HERE>).deliver
  end
end

根据Rails指南的section 2.3.4

  

可以通过一封电子邮件向一个或多个收件人发送电子邮件   (例如,通过设置列表来通知所有管理员新的注册)   发送电子邮件至:to key。电子邮件列表可以是一组电子邮件地址或单个电子邮件地址   字符串,地址以逗号分隔。

回顾你的尝试,仅供参考 - 这应该有效

def feedback_mail
    @verteiler = ["foo@bar.com", "bar@foo.com"]
    mail(:to => @verteiler, :subject => "Foo Bar")
end

答案 1 :(得分:1)

这让我花了1-2周的时间来理解,所以希望这段代码会让你知道该怎么做。

这是我的列表控制器,我生成要发送给邮件的消息:

def messages
  @list = List.find(params[:id]) 
  #@message =  Message.new( :user_id => @list.user.id, :list_id => @list.id, 
  #:subject => params[:subject], :body => params[:body] )
  @message = Message.new(params[:message])
  @contacts = @list.contacts

   respond_to do |format|
     if @list.save && @message.save  

       #Blaster is my mailer, and blast is the send method in the blaster.rb mailer

       Blaster.blast(@message, @contacts)
       format.html { 
         redirect_to @list, notice: 'Message was saved.' }
         format.json { render json: @list, status: :created, location: @list }
     else
       format.html { redirect_to @list, notice: 'There was an error, try again'}
       format.json { render json: @list.errors, status: :unprocessable_entity }
     end
   end

======

这是我的邮件 - 它叫做blast.rb

def blast(message, contacts)
    # can't send without a message, and an array of contacts 
    @message = message
    @contacts = contacts

    # with variables set, let's create the loop to do its magic 
    @contacts.each do |contact|
        mail = mail(
          :to => "#{contact.email}",
          :from => "noreply@foo.org",
          :return_path => "noreply@foo.org",  
          :subject => @message.subject,
          :body => @message.body
          #:template_path => 'blaster',
          #:template_name => 'blast'
          ) do |format|
            format.html { render 'blast.html.erb'}
            format.text { render 'blast.text.erb'}
            end   
        mail.deliver
    end # contacts.each loop
 end #blast method 

我很确定这段代码是次优的,而且质量很差,所以你可以在这里找到一些可以帮助你解决你的独特实现的东西。希望能帮助到你!

d。