2010-12-15 11 views
14

Me pregunto cómo podría abandonar de manera condicional el envío de correo dentro de la acción ActionMailer en sí misma.Rails 3: abandono el envío de correo dentro de la acción de ActionMailer

 

class SomeMailer < ActionMailer::Base 
    ... 

    def some_emails 
    some_models = Model.where(:a => 1) 
    if !some_models.blank? 
     mail(...) 
    else 
     # What to add here? 
     # render :nothing => true doesn't work 
    end 
    end 

end 
 

Ahora invocando esto a través de SomeMailer.some_emails.deliver! devuelve un ArgumentError: A sender (Return-Path, Sender or From) required to send a message

+0

¿Va a enviar un correo electrónico por cada modelo, o un correo electrónico con una lista de todos los modelos? – Samo

Respuesta

-1

su lugar poner sus condiciones en el lugar donde se está realizando la llamada a SomeMailer.some_emails.deliver!

+1

Bueno, esto se llama en un programador, no es el mejor lugar para agregar condiciones. – tamersalama

+1

hacer una llamada a otra cosa en el programador donde puede dar estas condiciones y desde allí realizar llamadas por correo. –

+2

-1 pregunta por un camino desde el interior de la acción de correo –

0

Tuve el mismo problema. No hay forma real de hacerlo dentro de la acción ActionMailer así que hice lo siguiente en mi tarea cron:

users.each do |user| 
    begin 
    UserMailer.event_second_reminder_group_user_email(user).deliver 
    puts " - sending reminder email to user #{user.email}" 
    rescue 
    end 
end 
puts "Complete!" 

Ahora bien, si se produce un error, no se rompe la aplicación!

+0

Generalmente no se recomienda realizar un rescate en blanco. Solo rescataría el error específico que podría surgir. – barnett

1

Lo extraño es que, con Rails 3.1.rc4 y WEBrick, funciona bien en mi servidor web WEBrick local. Pero tan pronto como me empuje a Heroku pila de cedro, su WEBrick lanza el

ArgumentError: A sender (Return-Path, Sender or From)

Tienes que eliminar las sentencias condicionales como se indica en la respuesta anterior. Se soluciona el problema de modo que también trabaja en Heroku, no sólo su máquina local

+0

Gracias a la excelente asistencia de Heroku que respondió rápidamente, descubrí que estaba equivocado acerca de mi comentario anterior. Si ejecuta WEBrick en modo de producción localmente, aparecerá el mismo error. Por lo tanto, no es un problema con Heroku, sino más bien una incoherencia de entornos locales de desarrollo y producción. – Frank

+0

Elimina o actualiza tu publicación cuando descubras que estás equivocado. +1 para tener en cuenta otras lecturas – kay

40

Set perform_deliveries a falso, así:

emails = get_email_list_somehow 
if emails.present? 
    mail options.merge(:bcc => emails) 
else 
    self.message.perform_deliveries = false 
end 

Este silencio no intentará enviar y debe parar el error suceda.

+3

+1 esta solución funciona si su proyecto no puede ser refactorizado para tomar la decisión de enviar el correo electrónico fuera de la clase de Mailer (por ejemplo, para trabajos retrasados, trabajos cron, etc.). – maerics

+0

Esta es la respuesta correcta. – brupm

+2

Estoy de acuerdo, esta es una mejor solución. Manténgalo SECO y haga el control en un solo lugar. –

1

En Rails 3.2.9 puede llamar condicionalmente al mail(). Aquí está el relacionado GitHub thread. Ahora el código del OP se puede volver a trabajar así:

class SomeMailer < ActionMailer::Base 
    ... 

    def some_emails 
    some_models = Model.where(:a => 1) 
    unless some_models.blank? 
     mail(...) 
    end 
    end 

end 
Cuestiones relacionadas