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