From 8ff33ac9f7819ea157f3045a75ea04963504f35d Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sat, 13 Jul 2013 08:11:20 +0000 Subject: [PATCH] Log email delivery errors (#14403). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@12010 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/mailer.rb | 12 +++++++++++- test/unit/mailer_test.rb | 23 +++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/app/models/mailer.rb b/app/models/mailer.rb index 5c773c5f1..83dbd9fc6 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -430,7 +430,17 @@ class Mailer < ActionMailer::Base def self.deliver_mail(mail) return false if mail.to.blank? && mail.cc.blank? && mail.bcc.blank? - super + begin + # Log errors when raise_delivery_errors is set to false, Rails does not + mail.raise_delivery_errors = true + super + rescue Exception => e + if ActionMailer::Base.raise_delivery_errors + raise e + else + Rails.logger.error "Email delivery error: #{e.message}" + end + end end def self.method_missing(method, *args, &block) diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb index f66e5763c..c4891678f 100644 --- a/test/unit/mailer_test.rb +++ b/test/unit/mailer_test.rb @@ -661,6 +661,29 @@ class MailerTest < ActiveSupport::TestCase assert_include '<tag>', html_part.body.encoded end + def test_should_raise_delivery_errors_when_raise_delivery_errors_is_true + mail = Mailer.test_email(User.find(1)) + mail.delivery_method.stubs(:deliver!).raises(Exception.new("delivery error")) + + ActionMailer::Base.raise_delivery_errors = true + assert_raise Exception, "delivery error" do + mail.deliver + end + ensure + ActionMailer::Base.raise_delivery_errors = false + end + + def test_should_log_delivery_errors_when_raise_delivery_errors_is_false + mail = Mailer.test_email(User.find(1)) + mail.delivery_method.stubs(:deliver!).raises(Exception.new("delivery error")) + + Rails.logger.expects(:error).with("Email delivery error: delivery error") + ActionMailer::Base.raise_delivery_errors = false + assert_nothing_raised do + mail.deliver + end + end + private def last_email