Ответ 1
Вместо этого разместите свои условия в том месте, где вы делаете вызов SomeMailer.some_emails.deliver!
Мне интересно, как я мог условно отказаться от отправки почты в самом действии 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
Теперь вызов этого через SomeMailer.some_emails.deliver!
возвращает
ArgumentError: A sender (Return-Path, Sender or From) required to send a message
Вместо этого разместите свои условия в том месте, где вы делаете вызов SomeMailer.some_emails.deliver!
Установите для параметра perform_deliveries значение false, например:
emails = get_email_list_somehow
if emails.present?
mail options.merge(:bcc => emails)
else
self.message.perform_deliveries = false
end
Это тихое не будет пытаться отправить и должно остановить ошибку.
Странно, что с Rails 3.1.rc4 и WEBrick он отлично работает на моем локальном веб-сервере WEBrick. Но как только я надавливаю на кедр кедра Хероку, их WEBrick бросает
ArgumentError: отправитель (Return-Path, Sender или From)
Вам нужно удалить условные утверждения, как указано в приведенном выше ответе. Это исправляет его так, что он также работает на Heroku, а не только на вашей локальной машине
В Rails 3.2.9 вы можете условно вызывать mail()
. Вот связанный поток GitHub. Теперь код OP можно переработать следующим образом:
class SomeMailer < ActionMailer::Base
...
def some_emails
some_models = Model.where(:a => 1)
unless some_models.blank?
mail(...)
end
end
end
У меня была такая же проблема. В действии ActionMailer нет реального способа сделать это, поэтому я сделал следующее в моей задаче 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!"
Теперь, если ошибка возникает, она не нарушает приложение!