ActionMailer::Base::NullMail при попытке уведомления об исключении в разработке

Я бы хотел добавить в наше приложение гем exception_notification, однако это происходит, когда я пытаюсь вручную вызвать почту:

exception
# => #<ZeroDivisionError: divided by 0>
ExceptionNotifier::Notifier.exception_notification(request.env, exception)
# => #<ActionMailer::Base::NullMail:0x007fa81bc7c610>
ExceptionNotifier::Notifier.background_exception_notification(exception)
# => #<ActionMailer::Base::NullMail:0x007fa81bf58190>

В приведенном выше примере консоль находится в точке останова внутри rescue_from Exception в ApplicationController после преднамеренного 1/0 в каком-то контроллере.

Я также использую delayed_job, но - не удивительно - ExceptionNotifier::Notifier.background_exception_notification(exception).deliver ничего не катит.

Я уже установил config.consider_all_requests_local = false в разработке, но все еще исключение-уведомление создает экземпляр NullMail. В других частях приложения почтовые программы работают просто отлично и используют sendmail,

Есть идеи, что я здесь делаю не так? Спасибо за вашу помощь!

2 ответа

Решение

Вероятно, вы используете старую версию ExceptionNotifier и более новую версию ActiveMailer::Base. Если не вызывать команду mail в функции электронной почты, будет возвращен экземпляр ActionMailer::Base::NullMail, а не экземпляр Mail.

Из документации:

class Notifier < ActionMailer::Base
  default :from => 'no-reply@example.com',
         :return_path => 'system@example.com'

  def welcome(recipient)
    @account = recipient
    mail(:to => recipient.email_address_with_name,
         :bcc => ["bcc@example.com", "Order Watcher <watcher@example.com>"])
  end
end

У меня были свои тесты / rspec, возвращающие объекты NullMail. решение было простым, мой код был:

def my_mail(foo)
   mail(
     to: to,
     from: from,
     subject: @sample_item.campaign_market.campaign.translation_for(language_id, 'sample_item_mailer.request_review.subject'),
     content_type: "text/html"
   )
   @sample_item.update_attributes!({feedback_requested: true, review_requested_at: Time.now})
   TrackingService::Event.new(@user, @user.market, 'sample_items', "request_review_email #{@sample_item.id}").call()
end

из документации ruby ​​не сразу понятно, что вам нужно возвращать функцию mail, а не просто выполнять ее. Если вам нужно что-то сделать после создания почтового объекта, убедитесь, что вы вернули письмо в конце. вот так:

def my_mail(foo)
   m = mail(
     to: to,
     from: from,
     subject: @sample_item.campaign_market.campaign.translation_for(language_id, 'sample_item_mailer.request_review.subject'),
     content_type: "text/html"
   )
   @sample_item.update_attributes!({feedback_requested: true, review_requested_at: Time.now})
   TrackingService::Event.new(@user, @user.market, 'sample_items', "request_review_email #{@sample_item.id}").call()
   return m
end
Другие вопросы по тегам