63 votes

Envoyer à plusieurs destinataires dans Rails avec ActionMailer

J'essaie d'envoyer plusieurs e-mails 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 "remplacement_needed" et cela devrait envoyer des e-mails à tous les utilisateurs qui ont demandé à recevoir ces e-mails. Le problème, c'est que tout semble envoyer à un seul e-mail. 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

84voto

raoul_dev Points 314

Dans les guides Rails (Action Mailer Basics), il est indiqué ce qui suit concernant plusieurs e-mails :

La liste des e-mails peut être un tableau d'adresses e-mail ou une seule chaîne avec les adresses séparées par des virgules.

Donc, "test1@gmail.com, test1@gmail.com" et ["test1@gmail.com", "test1@gmail.com"] devraient fonctionner.

Pour en savoir plus : http://guides.rubyonrails.org/action_mailer_basics.html

80voto

Chris Ledet Points 6543

Vous pouvez simplement envoyer un e-mail 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 , . Je pense que vous pouvez également passer un tableau à la :to mais pas sûr.

Le seul problème est que vous ne pourrez pas utiliser @name dans votre modèle. :(

64voto

noli Points 5625

J'ai le même problème. Je ne sais pas quel est l'accord. Je l'évite en :

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 ensuite la liste et appellerait la livraison "n" fois. Cela semble fonctionner :

 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 depuis le contrôleur, appelez

 Mailer.send_replacement_request(shift)

7voto

zolter Points 2188

Pour empêcher chaque destinataire de voir les autres adresses e-mail :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X