Enviar a múltiples destinatarios en Rails con ActionMailer


Estoy tratando de enviar varios correos electrónicos basados en un valor booleano en mi base de datos. La aplicación es una aplicación de programación simple y el usuario puede marcar su turno como" replacement_needed " y esto debe enviar correos electrónicos a todos los usuarios que han solicitado recibir estos correos electrónicos. El problema es que solo todos parecen enviar a un correo electrónico. Aquí está mi código actual:

 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
Author: Slick23, 2011-09-16

5 answers

Estoy teniendo este mismo problema.. no sé cuál es el trato.. Lo esquivo por:

En lugar de llamar

Mailer.request_replacement(shift).deliver 

De mi controlador,

Definiría un método de clase en el correo, y lo llamaría. Ese método luego iteraría a través de la lista y llamaría a delivery "n" veces... eso parece funcionar

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

Y desde el controlador, llame a

Mailer.send_replacement_request(shift)
 54
Author: noli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-27 09:29:52

Solo puede enviar un correo electrónico para varios destinatarios como este.

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

Esto tomará todas sus direcciones de correo electrónico @recipients y las unirá con ,. Creo que también puede pasar una matriz a la clave :to, pero no está seguro.

El único problema es que no podrás usar @name en tu plantilla. :(

 65
Author: Chris Ledet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-18 17:34:23

En las guías Rails (Action Mailer Basics) dice lo siguiente con respecto a múltiples correos electrónicos:

La lista de correos electrónicos puede ser una matriz de direcciones de correo electrónico o una sola cadena con las direcciones separadas por comas.

Así que ambos "[email protected], [email protected]" y ["[email protected]", "[email protected]"] deberían funcionar.

Ver más en: http://guides.rubyonrails.org/action_mailer_basics.html

 39
Author: raoul_dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-16 09:54:09

Para evitar que cada destinatario vea las otras direcciones de correo electrónico:

@recipients.each{ |recipient| Mailer.request_replacement(recipient, shift).deliver }
 7
Author: zolter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-14 16:30:29

Estoy usando Rieles 5 y tengo la misma situación, el correo electrónico se envió solo al último destinatario, pero también se envió como texto plano no como correo electrónico HTML.

Después de probar algunos consejos, terminé arreglándolo de esta manera:

El correo:

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

El controlador donde se invoca el correo:

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

Y en la vista, algo como esto:

<% @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 %>

Y funciona como un encanto! No estoy seguro si este es el forma correcta o la forma más óptima de ir, pero solo considéralo como una segunda posibilidad.

Espero que pueda ser útil para alguien más.

 0
Author: Alex Ventura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-07 04:59:52