データベース内のブール値に基づいて複数のメールを送信しようとしています。このアプリはシンプルなスケジューリングアプリであり、ユーザーはシフトを「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
私はこれと同じ問題を抱えています。
呼び出す代わりに
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)
このように、複数の受信者に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
を使用できないことです。 :(
Railsガイド(Action Mailer Basics))では、複数の電子メールに関して次のように述べています。
電子メールのリストは、電子メールアドレスの配列、またはアドレスをコンマで区切った単一の文字列にすることができます。
両方の"[email protected], [email protected]"
および["[email protected]", "[email protected]"]
動作するはずです。
各受信者が他の電子メールアドレスを表示できないようにするには:
@recipients.each{ |recipient| Mailer.request_replacement(recipient, shift).deliver }
私は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番目の可能性として考えてください。
私はそれが他の誰かに役立つことを願っています。