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