Как отловить ошибку отправки email?

Gemfile:
gem 'resque_mailer', '2.2.7' # Асинхронные отправки почты
controller:
def some
 MyMailer.send(parameter).deliver
rescue Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError => e
#Здесь я могу отловить ошибку, но здесь мне не надо
end

mailer:
class MyMailer < ActionMailer::Base
  include Resque::Mailer
  def send param
     smtp_sets = LoadSmtpSets(1)
       mail 	subject: 'some', from: 'some@mail.ru', delivery_method_options: smtp_sets
  rescue Net::SMTPAuthenticationError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Net::SMTPFatalError, Net::SMTPUnknownError => e
       smtp_sets = LoadSmtpSets(2)
       mail 	subject: 'some', from: 'some@mail.ru', delivery_method_options: smtp_sets
     #этот блок никогда не вызывается, а надо отловить ошибку, которую дает яндекс, к примеру
  end
end


Суть: пытаюсь отправить с одного почтового ящика, возможна ошибка отправки, тогда вызывается отправка с другой почты.
Проблема: Не вызывается блок rescue
ошибку могу поймать только из контроллера. Теперь имеем кучу контроллеров из которых отправляется данное письмо. Хочу обработку ошибки отправки прикрутить в код мейлера, а не контроллера.
Блок rescue мейлера срабатывает, например, если есть синтаксическая ошибка в коде мейлера или я насильно raise some error, но не срабатывает при ошибке отправки.
Благодарю заранее
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
@sunnmas Автор вопроса
Ruby
Custom handling of errors that arise when sending a message is possible by assigning a lambda to the error_handler attribute. There are two supported lambdas for backwards compatiability.

The first lamba will be deprecated in a future release:

Resque::Mailer.error_handler = lambda { |mailer, message, error|
# some custom error handling code here in which you optionally re-raise the error
}
The new lamba contains two other arguments, action and args, which allows mailers to be requeued on failure:

Resque::Mailer.error_handler = lambda { |mailer, message, error, action, args|
# Necessary to re-enqueue jobs that receieve the SIGTERM signal
if error.is_a?(Resque::TermException)
Resque.enqueue(mailer, action, *args)
else
raise error
end
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Dem1
@Dem1 Куратор тега Ruby on Rails
Ruby on Rails developer
config.action_mailer.raise_delivery_errors = true
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы