Rails 3 - отказаться от отправки почты в рамках действия ActionMailer - PullRequest
14 голосов
/ 15 декабря 2010

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

Ответы [ 5 ]

41 голосов
/ 03 мая 2012

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

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

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

2 голосов
/ 12 ноября 2012

В Rails 3.2.9 вы можете, наконец, условно вызвать mail(). Вот связанная тема GitHub . Теперь код ОП можно переделать так:

class SomeMailer < ActionMailer::Base
  ...

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

end
1 голос
/ 22 июля 2011

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

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

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

0 голосов
/ 08 июля 2011

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

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

0 голосов
/ 15 декабря 2010

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

...