Отправка нескольким получателям в Rails с помощью ActionMailer - PullRequest
46 голосов
/ 16 сентября 2011

Я пытаюсь отправить несколько электронных писем на основе логического значения в моей базе данных. Приложение представляет собой простое приложение для планирования, и пользователь может пометить их смену как «replace_needed», и это должно отсылать электронные письма всем пользователям, которые запросили эти электронные письма. Беда в том, что кажется, что каждый отправляет только одно письмо. Вот мой текущий код:

 def request_replacement(shift)
      @shift = shift
      @user = shift.user
      @recipients = User.where(:replacement_emails => true).all
      @url  = root_url
      @recipients.each do |r|
        @name = r.fname
        mail(:to => r.email,
           :subject => "A replacement clerk has been requested")
      end
  end

Ответы [ 5 ]

70 голосов
/ 16 сентября 2011

Вы можете просто отправить одно электронное письмо нескольким получателям, как это.

def request_replacement(shift)
  @shift = shift
  @user = shift.user
  @recipients = User.where(:replacement_emails => true)
  @url  = root_url
  emails = @recipients.collect(&:email).join(",")
  mail(:to => emails, :subject => "A replacement clerk has been requested")
end

Это займет все ваши @recipients адреса электронной почты и присоединится к ним с ,.Я думаю, что вы также можете передать массив на ключ :to, но не уверен.

Единственная проблема в том, что вы не сможете использовать @name в своем шаблоне.(

58 голосов
/ 27 сентября 2011

У меня такая же проблема .. Не знаю, в чем дело ... Я обошел ее стороной:

вместо того, чтобы звонить

Mailer.request_replacement(shift).deliver 

с моего контроллера,

Я бы определил метод класса в почтовой программе и вызвал бы это.Затем этот метод будет выполнять итерацию по списку и вызывать «n» раз ... что, кажется, работает

class Mailer

   def self.send_replacement_request(shift)
     @recipients = ...
     @recipients.each do |recipient|
       request_replacement(recipient, shift).deliver
     end
   end

   def request_replacement(recipient, shift)
     ...
     mail(...)
   end
end

, а из контроллера вызывать

Mailer.send_replacement_request(shift)
49 голосов
/ 16 марта 2015

В руководствах Rails (Основы Action Mailer) говорится о нескольких электронных письмах:

Список электронных писем может быть массивом адресов электронной почты или одной строкой с адресами, разделенными запятыми.

Так что "test1@gmail.com, test1@gmail.com" и ["test1@gmail.com", "test1@gmail.com"] должны работать.

Подробнее на: http://guides.rubyonrails.org/action_mailer_basics.html

7 голосов
/ 14 мая 2014

Чтобы каждый получатель не видел другие адреса электронной почты:

@recipients.each{ |recipient| Mailer.request_replacement(recipient, shift).deliver }
1 голос
/ 07 января 2018

Я использую Rails 5 , и у меня такая же ситуация: электронное письмо было отправлено только последнему получателю, но также оно было отправлено как обычный текст, а не как электронное письмо в формате HTML.

Попробовав несколько советов, я решил исправить это следующим образом:

Почтовый клиент:

class BrochureMailer < ApplicationMailer
    default from: "info@site.com"

    def newsletter(sponsor, brochures_list)
        @sponsor = sponsor
        @brochures = brochures_list

        mail(
            to: @sponsor.email,
            subject: "Interesting subject!"
        )
    end
end

Контроллергде вызывается почтовая программа:

class Admin::DashboardController < Admin::BaseController
    def send_newsletter
        sponsors = params[:sponsor_ids]
        brochures = params[:brochure_ids]

        sponsors = Sponsor.where(id: sponsors)
        brochures = Brochure.where(id: brochures).to_a

        # Send Newsletter email to the given Sponsors
        sponsors.each do |sponsor|
            BrochureMailer.newsletter(sponsor, brochures).deliver_later
        end

        redirect_back(fallback_location: admin_root_path, success: 'Newsletter sent!')
    end
end

И в представлении, что-то вроде этого:

<% @brochures.each do |brochure| %>
    <table width="280" border="0" cellpadding="0" cellspacing="0" align="left" valign="top" class="floater">
        <tr>
            <td align="center" valign="top">
                <a target="_blank" href="<%= brochure_url(brochure) %>">
                    <img border="0" vspace="0" hspace="0" src="<%= brochure.image.blank? ? 'default.png' : brochure.image.url(public: true) %>" width="250" height="142">
                    <b><%= brochure.title %></b>
                </a>
                <br>
                <%= brochure.description.truncate(60) %>
            </td>
        </tr>
    </table>
<% end %>

И это работает как шарм!Я не уверен, что это правильный путь или самый оптимальный путь, но просто считаю это второй возможностью.

Я надеюсь, что это может быть полезно для кого-то еще.

...