web-dev-qa-db-ja.com

Rails ActionMailerで複数の受信者に送信

データベース内のブール値に基づいて複数のメールを送信しようとしています。このアプリはシンプルなスケジューリングアプリであり、ユーザーはシフトを「replacement_needed」としてマークできます。これにより、これらのメールの受信をリクエストしたすべてのユーザーにメールが送信されます。問題は、すべてが1つのメールに送信されるように見えることです。現在のコードは次のとおりです。

 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
46
Slick23

私はこれと同じ問題を抱えています。

呼び出す代わりに

Mailer.request_replacement(shift).deliver 

私のコントローラーから

メーラーでクラスメソッドを定義し、それを呼び出します。そのメソッドは、リストを反復処理し、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)
58
noli

このように、複数の受信者に1つのメールを送信できます。

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を使用できないことです。 :(

70
Chris Ledet

Railsガイド(Action Mailer Basics))では、複数の電子メールに関して次のように述べています。

電子メールのリストは、電子メールアドレスの配列、またはアドレスをコンマで区切った単一の文字列にすることができます。

両方の"[email protected], [email protected]"および["[email protected]", "[email protected]"]動作するはずです。

詳細は http://guides.rubyonrails.org/action_mailer_basics.html

49
raoul_dev

各受信者が他の電子メールアドレスを表示できないようにするには:

@recipients.each{ |recipient| Mailer.request_replacement(recipient, shift).deliver }
7
zolter

私はRails 5を使用していますが、同じ状況があり、メールは最後の受信者だけでなく、 HTMLメールではなくプレーンテキストとして送信されました。

いくつかのアドバイスを試した後、次のように修正しました。

メーラー:

class BrochureMailer < ApplicationMailer
    default from: "[email protected]"

    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 %>

そして、それは魅力のように機能します!これが正しい方法なのか、最適な方法なのかはわかりませんが、2番目の可能性として考えてください。

私はそれが他の誰かに役立つことを願っています。

1
Alex Ventura