2010-12-15 42 views
14

Je me demande comment je pourrais abandonner conditionnellement l'envoi de courrier dans l'action ActionMailer elle-même.Rails 3 - abandonner l'envoi de courrier dans l'action 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 
 

Maintenant, l'invocation de cette grâce SomeMailer.some_emails.deliver! retourne un ArgumentError: A sender (Return-Path, Sender or From) required to send a message

+0

Allez-vous envoyer un e-mail pour chaque modèle, ou un e-mail avec une liste de tous les modèles? – Samo

Répondre

-1

mettre vos conditions lieu à l'endroit où vous faites l'appel à SomeMailer.some_emails.deliver!

+1

Bien - cela est appelé dans un planificateur, pas le meilleur endroit pour ajouter des conditions. – tamersalama

+1

appel à quelque chose d'autre dans le planificateur où vous pouvez donner ces conditions et de là faire des appels de courrier. –

+2

-1 question posée pour un chemin à l'intérieur de l'action mailer –

0

J'ai eu ce même problème. Il n'y a aucun moyen de le faire dans l'action ActionMailer donc je ne suit dans ma tâche 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!" 

Maintenant, si une erreur est renvoyée, il ne rompt pas l'application!

+0

La mise en place d'une sauvegarde vierge n'est généralement pas recommandée. Je ne ferais que sauver l'erreur spécifique qui pourrait être soulevée. – barnett

1

La chose étrange est que, avec Rails 3.1.rc4 et WEBrick, cela fonctionne très bien sur mon serveur web WEBrick local. Mais dès que je pousse à pile de cèdre Heroku, leur WEBrick jette le

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

Vous devez supprimer les instructions conditionnelles comme indiqué dans la réponse ci-dessus. Ce problème est résolu pour que cela fonctionne aussi sur Heroku, pas seulement votre machine locale

+0

Merci à l'excellent support Heroku qui a répondu rapidement, j'ai découvert que j'avais tort sur mon commentaire précédent. Si vous exécutez WEBrick en mode de production localement, la même erreur apparaît. Ce n'est donc pas un problème avec Heroku mais plutôt une incohérence des environnements de développement et de production locaux. – Frank

+0

Veuillez supprimer ou mettre à jour votre message lorsque vous avez découvert que vous vous trompiez. +1 pour garder d'autres lectures à l'esprit! – kay

40

Set perform_deliveries false, comme suit:

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

Cela va essayer tranquillement de ne pas envoyer et devrait cesser l'erreur de se produire.

+3

+1 cette solution fonctionne si votre projet ne peut pas être refactorisé pour prendre la décision d'envoyer l'e-mail en dehors de la classe Mailer (par exemple, pour les travaux retardés, les tâches cron, etc.). – maerics

+0

Ceci est la bonne réponse. – brupm

+2

Je suis d'accord - c'est une meilleure solution. Gardez-le au sec et faites le contrôle en un seul endroit. –

1

Dans Rails 3.2.9, vous pouvez enfin appeler le mail(). Voici les GitHub thread connexes. Maintenant, le code de l'OP peut être retravaillé comme ceci:

class SomeMailer < ActionMailer::Base 
    ... 

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

end