Rails 3 - отказаться от отправки почты в действии ActionMailer

Мне интересно, как я мог условно отказаться от отправки почты в самом действии 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

Ответы

Ответ 1

Вместо этого разместите свои условия в том месте, где вы делаете вызов SomeMailer.some_emails.deliver!

Ответ 2

Установите для параметра perform_deliveries значение false, например:

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

Это тихое не будет пытаться отправить и должно остановить ошибку.

Ответ 3

Странно, что с Rails 3.1.rc4 и WEBrick он отлично работает на моем локальном веб-сервере WEBrick. Но как только я надавливаю на кедр кедра Хероку, их WEBrick бросает

ArgumentError: отправитель (Return-Path, Sender или From)

Вам нужно удалить условные утверждения, как указано в приведенном выше ответе. Это исправляет его так, что он также работает на Heroku, а не только на вашей локальной машине

Ответ 4

В 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

Ответ 5

У меня была такая же проблема. В действии 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!"

Теперь, если ошибка возникает, она не нарушает приложение!