]> source.dussan.org Git - redmine.git/commitdiff
Don't raise an exception when the emission email address is not RFC compliant (#5913).
authorGo MAEDA <maeda@farend.jp>
Mon, 8 Apr 2019 13:28:34 +0000 (13:28 +0000)
committerGo MAEDA <maeda@farend.jp>
Mon, 8 Apr 2019 13:28:34 +0000 (13:28 +0000)
Patch by Go MAEDA.

git-svn-id: http://svn.redmine.org/redmine/trunk@18050 e93f8b46-1217-0410-a6f0-8f06a7374b81

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

index c1eef53e49cb674c34ab6f11b83ececf8493127a..51ee6db78d5bcd743b4f6ffb42436a713902fa68 100644 (file)
@@ -629,10 +629,19 @@ class Mailer < ActionMailer::Base
   def mail(headers={}, &block)
     # Add a display name to the From field if Setting.mail_from does not
     # include it
-    mail_from = Mail::Address.new(Setting.mail_from)
-    if mail_from.display_name.blank? && mail_from.comments.blank?
-      mail_from.display_name =
-        @author&.logged? ? @author.name : Setting.app_title
+    begin
+      mail_from = Mail::Address.new(Setting.mail_from)
+      if mail_from.display_name.blank? && mail_from.comments.blank?
+        mail_from.display_name =
+          @author&.logged? ? @author.name : Setting.app_title
+      end
+      from = mail_from.format
+      list_id = "<#{mail_from.address.to_s.tr('@', '.')}>"
+    rescue Mail::Field::IncompleteParseError
+       # Use Setting.mail_from as it is if Mail::Address cannot parse it
+       # (probably the emission address is not RFC compliant)
+      from = Setting.mail_from.to_s
+      list_id = "<#{from.tr('@', '.')}>"
     end
 
     headers.reverse_merge! 'X-Mailer' => 'Redmine',
@@ -640,8 +649,8 @@ class Mailer < ActionMailer::Base
             'X-Redmine-Site' => Setting.app_title,
             'X-Auto-Response-Suppress' => 'All',
             'Auto-Submitted' => 'auto-generated',
-            'From' => mail_from.format,
-            'List-Id' => "<#{mail_from.address.to_s.tr('@', '.')}>"
+            'From' => from,
+            'List-Id' => list_id
 
     # Replaces users with their email addresses
     [:to, :cc, :bcc].each do |key|
index 51fc001f9d1439b3721e34f9f690b8899b761175..418d8ad69ac84bad408a14651696aa06c70384aa 100644 (file)
@@ -252,6 +252,18 @@ class MailerTest < ActiveSupport::TestCase
     assert_equal 'Redmine app <redmine@example.net>', mail.header['From'].to_s
   end
 
+  def test_from_header_with_rfc_non_compliant_phrase
+    # Send out the email instead of raising an exception
+    # no matter if the emission email address is not RFC compliant
+    assert_nothing_raised do
+      with_settings :mail_from => '[Redmine app] <redmine@example.net>' do
+        Mailer.deliver_test_email(User.find(1))
+      end
+    end
+    mail = last_email
+    assert_match /<redmine@example\.net>/, mail.from_addrs.first
+    assert_equal '[Redmine app] <redmine@example.net>', mail.header['From'].to_s
+  end
   def test_from_header_with_author_name
     # Use the author's name or Setting.app_title as a display name
     # when Setting.mail_from does not include a display name