rails ruby-on-rails-3 actionmailer

ruby-on-rails-3 - rails send email sendgrid



Enviar a destinatarios múltiples en Rails con ActionMailer (5)

En las guías de Rails (Conceptos básicos de Action Mailer), dice lo siguiente con respecto a varios 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.

Por lo tanto "[email protected], [email protected]" tanto "[email protected], [email protected]" y ["[email protected]", "[email protected]"] deberían funcionar.

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

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 debería enviar correos electrónicos a todos los usuarios que han solicitado recibir estos correos electrónicos. El problema es que solo parece enviar 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


Estoy teniendo el mismo problema. No sé cuál es el problema. Lo evito de la siguiente manera:

en lugar de llamar

Mailer.request_replacement(shift).deliver

desde mi controlador,

Definiría un método de clase en el programa de correo y llamaría eso. Ese método luego iteraría a través de la lista y llamaría "n" veces ... que 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

Mailer.send_replacement_request(shift)


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

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

El anuncio publicitario:

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 anuncio publicitario:

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 de si esta es la forma correcta o la manera más óptima de ir, pero simplemente considere que es una segunda posibilidad.

Espero que pueda ser útil para otra persona.


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

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


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 @recipients correo electrónico @recipients y se unirá a ellas @recipients Creo que también puedes pasar una matriz a la tecla :to pero no estoy seguro.

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