summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGo MAEDA <maeda@farend.jp>2019-04-08 13:28:34 +0000
committerGo MAEDA <maeda@farend.jp>2019-04-08 13:28:34 +0000
commitce6e9ca95062465b14a425340923493b15fe903e (patch)
treee63f2ced10347079b9c64e33a1f534abce4eb73c
parentcae8905b7c835df863656b4bb2c6b8cb223a198d (diff)
downloadredmine-ce6e9ca95062465b14a425340923493b15fe903e.tar.gz
redmine-ce6e9ca95062465b14a425340923493b15fe903e.zip
Don't raise an exception when the emission email address is not RFC compliant (#5913).
Patch by Go MAEDA. git-svn-id: http://svn.redmine.org/redmine/trunk@18050 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/models/mailer.rb21
-rw-r--r--test/unit/mailer_test.rb12
2 files changed, 27 insertions, 6 deletions
diff --git a/app/models/mailer.rb b/app/models/mailer.rb
index c1eef53e4..51ee6db78 100644
--- a/app/models/mailer.rb
+++ b/app/models/mailer.rb
@@ -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|
diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb
index 51fc001f9..418d8ad69 100644
--- a/test/unit/mailer_test.rb
+++ b/test/unit/mailer_test.rb
@@ -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