]> source.dussan.org Git - redmine.git/commitdiff
Log email delivery errors (#14403).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 13 Jul 2013 08:11:20 +0000 (08:11 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sat, 13 Jul 2013 08:11:20 +0000 (08:11 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@12010 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/mailer.rb
test/unit/mailer_test.rb

index 5c773c5f1d6623cbba6ef3adf966c336e9a3a75a..83dbd9fc6be641704779afbd5cdd415e2c7802f5 100644 (file)
@@ -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)
index f66e5763ce28c8c8c7aabc01b6adde7f34269408..c4891678f2eb660312f317b176b55fafd7de1fea 100644 (file)
@@ -661,6 +661,29 @@ class MailerTest < ActiveSupport::TestCase
     assert_include '&lt;tag&gt;', 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