J'essaie d'envoyer plusieurs emails en fonction d'une valeur booléenne dans ma base de données. L'application est une application de planification simple et l'utilisateur peut marquer son quart de travail comme "replacement_needed", ce qui devrait envoyer des courriels à tous les utilisateurs qui ont demandé à recevoir ces courriels. Le problème, c'est qu'il semble que tout semble envoyer à un seul email. Voici mon code actuel:
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
je vais avoir le même problème .. Je ne sais pas ce que le contrat est ..
au lieu d'appeler
Mailer.request_replacement(shift).deliver
de mon contrôleur,
Je définirais une méthode de classe sur le mailer et l'appellerais. Cette méthode parcourrait alors la liste et appellerait "n" fois ...
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
et du contrôleur, appelez
Mailer.send_replacement_request(shift)
Vous pouvez simplement envoyer un email pour plusieurs destinataires comme celui-ci.
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
Cela prendra toutes vos adresses e-mail @recipients
et les rejoindra avec ,
. Je pense que vous pouvez également passer un tableau à la clé :to
mais pas sûr.
Le seul problème est que vous ne pourrez pas utiliser @name
dans votre modèle. :(
Dans les guides Rails (Action Mailer Basics), il est indiqué ce qui suit concernant plusieurs courriels:
La liste des e-mails peut être un tableau d'adresses e-mail ou une chaîne unique, les adresses étant séparées par des virgules.
Donc, "[email protected], [email protected]"
et ["[email protected]", "[email protected]"]
devraient fonctionner.
Voir plus sur: http://guides.rubyonrails.org/action_mailer_basics.html
Pour empêcher chaque destinataire de voir les autres adresses électroniques:
@recipients.each{ |recipient| Mailer.request_replacement(recipient, shift).deliver }
J'utilise Rails 5 et j'ai la même situation, le courrier électronique n'a été envoyé qu'au dernier destinataire, mais il l'a également été envoyé en tant que texte brut et non en tant que courrier électronique HTML.
Après avoir essayé quelques conseils, j'ai fini par le réparer:
Le mailer:
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
Le contrôleur où l'expéditeur est appelé:
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
Et dans la vue, quelque chose comme ça:
<% @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 %>
Et cela fonctionne comme un charme! Je ne suis pas sûr que ce soit la bonne façon ou la façon la plus optimale de procéder, mais considérez simplement cela comme une seconde possibilité.
J'espère que cela pourra être utile à quelqu'un d'autre.