web-dev-qa-db-fra.com

Envoyer à plusieurs destinataires dans Rails avec ActionMailer

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

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)
58
noli

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. :(

70
Chris Ledet

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

44
raoul_dev

Pour empêcher chaque destinataire de voir les autres adresses électroniques: 

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

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.

0
Alex Ventura