sto usando Rails 5 e ho la stessa situazione, l'email è stata inviata solo per l'ultimo destinatario, ma anche è stato inviato come testo normale non come Email HTML
Dopo aver provato alcuni consigli, ho finito per fissarlo in questo modo:
Il programma di posta:
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
Il controller in cui viene richiamato il programma di posta:
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
E nella vista, qualcosa di simile:
<% @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 %>
E funziona come un fascino! Non sono sicuro se questo è il modo corretto o il modo migliore per andare, ma consideralo come una seconda possibilità.
Spero possa essere utile per qualcun altro.
fonte
2018-01-07 04:59:52
La chiamata a #mail in realtà non invia l'email, crea solo l'oggetto di posta. La chiamata di #deliver su quell'oggetto di posta lo invia. Quindi, solo l'ultimo creato viene inviato quando si chiama #deliver (presumibilmente in un altro bit di codice). –