7

我想将 exception_notification gem 添加到我们的应用程序中,但是,当我尝试手动触发邮件时会发生这种情况:

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在开发中设置了,但仍然 exception_notification 实例化 NullMail。在应用程序的其他部分,邮件程序可以正常工作并使用sendmail.

有什么想法我在这里做错了吗?谢谢你的帮助!

4

2 回答 2

9

您可能正在使用旧版本的 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
于 2013-04-02T14:23:25.647 回答
3

我有我的测试/ 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 文档中没有立即明确的是您需要返回邮件功能,而不仅仅是执行它。如果您在构建邮件对象后需要做某事,请确保在最后返回邮件。像这样:

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
于 2014-07-17T16:08:29.623 回答