Задать вопрос

Как отловить ошибку отправки 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, но не срабатывает при ошибке отправки.
Благодарю заранее
  • Вопрос задан
  • 224 просмотра
Подписаться 1 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Code Basics
    Ruby для начинающих
    1 месяц
    Далее
  • Skillbox
    Ruby on Rails с нуля
    10 месяцев
    Далее
  • Хекслет
    Разработчик на Ruby on Rails
    5 месяцев
    Далее
Решения вопроса 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
Ответ написан
Ваш ответ на вопрос

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

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