diff options
-rw-r--r-- | app/models/mailer.rb | 15 | ||||
-rw-r--r-- | test/unit/mailer_test.rb | 25 |
2 files changed, 31 insertions, 9 deletions
diff --git a/app/models/mailer.rb b/app/models/mailer.rb index ddbc7b394..7721997f6 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -661,16 +661,25 @@ class Mailer < ActionMailer::Base end def mail(headers={}, &block) - # Add a display name to the From field if Setting.mail_from does not - # include it begin + # 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 end from = mail_from.format - list_id = "<#{mail_from.address.to_s.tr('@', '.')}>" + + # Construct the value of the List-Id header field + from_addr = mail_from.address.to_s + project_identifier = self.headers['X-Redmine-Project']&.value + list_id = if project_identifier.present? + "<#{project_identifier}.#{from_addr.tr('@', '.')}>" + else + # Emails outside of a project context + "<#{from_addr.tr('@', '.')}>" + end 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) diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb index 0506e27d2..2cb5c4ca4 100644 --- a/test/unit/mailer_test.rb +++ b/test/unit/mailer_test.rb @@ -212,15 +212,11 @@ class MailerTest < ActiveSupport::TestCase end def test_email_headers - with_settings :mail_from => 'Redmine <redmine@example.net>' do - issue = Issue.find(1) - Mailer.deliver_issue_add(issue) - end + issue = Issue.find(1) + Mailer.deliver_issue_add(issue) mail = last_email assert_equal 'All', mail.header['X-Auto-Response-Suppress'].to_s assert_equal 'auto-generated', mail.header['Auto-Submitted'].to_s - # List-Id should not include the display name "Redmine" - assert_equal '<redmine.example.net>', mail.header['List-Id'].to_s assert_equal 'Bug', mail.header['X-Redmine-Issue-Tracker'].to_s assert_equal 'Low', mail.header['X-Redmine-Issue-Priority'].to_s end @@ -327,6 +323,23 @@ class MailerTest < ActiveSupport::TestCase end end + def test_list_id_header_should_include_project_identifier + with_settings :mail_from => 'Redmine <redmine@example.net>' do + content = WikiContent.find(1) + Mailer.deliver_wiki_content_added(content) + mail = last_email + assert_equal '<ecookbook.redmine.example.net>', mail.header['List-Id'].to_s + end + end + + def test_list_id_header_excludes_project_identifier_for_non_project_emails + with_settings :mail_from => 'Redmine <redmine@example.net>' do + Mailer.deliver_test_email(User.find(1)) + mail = last_email + assert_equal '<redmine.example.net>', mail.header['List-Id'].to_s + end + end + def test_should_not_send_email_without_recipient news = News.first user = news.author |