Отправить несколько писем в одной команде доставки? - PullRequest
3 голосов
/ 09 сентября 2011

Я пытаюсь отправить несколько писем одной командой .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 ]

3 голосов
/ 09 сентября 2011

Эта идея не будет сильно масштабироваться - вам нужно реализовать что-то вроде 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

Согласно разделу 2.3.4 Руководства по Rails:

Возможно отправлять электронную почту одному или нескольким получателям в одном письме (например, для информированиявсе администраторы новой регистрации), установив в списке писем ключ: to.Список электронных писем может быть массивом адресов электронной почты или одной строкой с адресами, разделенными запятыми.

Оглядываясь назад на вашу попытку, FYI - это должно сработать

def feedback_mail
    @verteiler = ["foo@bar.com", "bar@foo.com"]
    mail(:to => @verteiler, :subject => "Foo Bar")
end
1 голос
/ 24 июня 2013

Это заняло у меня большую часть 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.

...