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