diff --git a/app/models/mailer.rb b/app/models/mailer.rb --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -34,7 +34,6 @@ class Mailer < ActionMailer::Base 'Issue-Author' => issue.author.login redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to message_id issue - references issue @author = issue.author @issue = issue @users = to_users + cc_users @@ -398,10 +397,11 @@ class Mailer < ActionMailer::Base end if @message_id_object - headers[:message_id] = "<#{self.class.message_id_for(@message_id_object)}>" + headers[:message_id] = "<#{self.class.message_id_for(@message_id_object, @users, @issue)}>" end if @references_objects - headers[:references] = @references_objects.collect {|o| "<#{self.class.references_for(o)}>"}.join(' ') + headers[:references] = + @references_objects.collect {|o| "<#{self.class.references_for(o, @users, @issue)}>"}.join(' ') end m = if block_given? @@ -454,15 +454,18 @@ class Mailer < ActionMailer::Base h.each { |k,v| headers["X-Redmine-#{k}"] = v.to_s } end - def self.token_for(object, rand=true) + def self.token_for(object, users, issue) timestamp = object.send(object.respond_to?(:created_on) ? :created_on : :updated_on) hash = [ "redmine", "#{object.class.name.demodulize.underscore}-#{object.id}", timestamp.strftime("%Y%m%d%H%M%S") ] - if rand - hash << Redmine::Utils.random_hex(8) + if users && users.present? && issue + ids = issue.visible_custom_field_values(users.first).map(&:custom_field_id).sort + if ids.present? + hash << Digest::SHA1.hexdigest(ids.join(","))[0, 8] + end end host = Setting.mail_from.to_s.strip.gsub(%r{^.*@|>}, '') host = "#{::Socket.gethostname}.redmine" if host.empty? @@ -470,14 +473,14 @@ class Mailer < ActionMailer::Base end # Returns a Message-Id for the given object - def self.message_id_for(object) - token_for(object, true) + def self.message_id_for(object, users, issue) + token_for(object, users, issue) end # Returns a uniq token for a given object referenced by all notifications # related to this object - def self.references_for(object) - token_for(object, false) + def self.references_for(object, users, issue) + token_for(object, users, issue) end def message_id(object) diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb --- a/test/unit/mailer_test.rb +++ b/test/unit/mailer_test.rb @@ -245,7 +245,6 @@ class MailerTest < ActiveSupport::TestCa Mailer.deliver_issue_add(issue) mail = last_email assert_match /^redmine\.issue-2\.20060719190421\.[a-f0-9]+@example\.net/, mail.message_id - assert_include "redmine.issue-2.20060719190421@example.net", mail.references end def test_issue_edit_message_id @@ -255,7 +254,7 @@ class MailerTest < ActiveSupport::TestCa Mailer.deliver_issue_edit(journal) mail = last_email assert_match /^redmine\.journal-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id - assert_include "redmine.issue-2.20060719190421@example.net", mail.references + assert_match /^redmine\.issue-2\.20060719190421\.[a-f0-9]+@example\.net/, mail.references assert_select_email do # link to the update assert_select "a[href=?]", @@ -267,7 +266,7 @@ class MailerTest < ActiveSupport::TestCa message = Message.find(1) Mailer.message_posted(message).deliver mail = last_email - assert_match /^redmine\.message-1\.\d+\.[a-f0-9]+@example\.net/, mail.message_id + assert_include "redmine.message-1.20070512151532@example.net", mail.message_id assert_include "redmine.message-1.20070512151532@example.net", mail.references assert_select_email do # link to the message @@ -281,7 +280,7 @@ class MailerTest < ActiveSupport::TestCa message = Message.find(3) Mailer.message_posted(message).deliver mail = last_email - assert_match /^redmine\.message-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id + assert_include "redmine.message-3.20070512151802@example.net", mail.message_id assert_include "redmine.message-1.20070512151532@example.net", mail.references assert_select_email do # link to the reply @@ -652,7 +651,8 @@ class MailerTest < ActiveSupport::TestCa def test_token_for_should_strip_trailing_gt_from_address_with_full_name with_settings :mail_from => "Redmine Mailer" do - assert_match /\Aredmine.issue-\d+\.\d+\.[0-9a-f]+@redmine.org\z/, Mailer.token_for(Issue.generate!) + assert_match /\Aredmine.issue-\d+\.\d+\.[0-9a-f]+@redmine.org\z/, + Mailer.token_for(Issue.generate!, [User.find(1)], Issue.find(1)) end end