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