diff --git a/app/models/mailer.rb b/app/models/mailer.rb index dc155648e..419aa5b5a 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -134,6 +134,7 @@ class Mailer < ActionMailer::Base redmine_headers 'Project' => document.project.identifier @author = author @document = document + @user = user @document_url = url_for(:controller => 'documents', :action => 'show', :id => document) mail :to => user, :subject => "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}" @@ -169,6 +170,7 @@ class Mailer < ActionMailer::Base end redmine_headers 'Project' => container.project.identifier @attachments = attachments + @user = user @added_to = added_to @added_to_url = added_to_url mail :to => user, @@ -200,6 +202,7 @@ class Mailer < ActionMailer::Base message_id news references news @news = news + @user = user @news_url = url_for(:controller => 'news', :action => 'show', :id => news) mail :to => user, :subject => "[#{news.project.name}] #{l(:label_news)}: #{news.title}" @@ -225,6 +228,7 @@ class Mailer < ActionMailer::Base references news @news = news @comment = comment + @user = user @news_url = url_for(:controller => 'news', :action => 'show', :id => news) mail :to => user, :subject => "Re: [#{news.project.name}] #{l(:label_news)}: #{news.title}" @@ -250,6 +254,7 @@ class Mailer < ActionMailer::Base message_id message references message.root @message = message + @user = user @message_url = url_for(message.event_url) mail :to => user, :subject => "[#{message.board.project.name} - #{message.board.name} - msg#{message.root.id}] #{message.subject}" @@ -276,6 +281,7 @@ class Mailer < ActionMailer::Base @author = wiki_content.author message_id wiki_content @wiki_content = wiki_content + @user = user @wiki_content_url = url_for(:controller => 'wiki', :action => 'show', :project_id => wiki_content.project, :id => wiki_content.page.title) @@ -301,6 +307,7 @@ class Mailer < ActionMailer::Base @author = wiki_content.author message_id wiki_content @wiki_content = wiki_content + @user = user @wiki_content_url = url_for(:controller => 'wiki', :action => 'show', :project_id => wiki_content.project, :id => wiki_content.page.title) @@ -659,10 +666,10 @@ 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, @user)}>" 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, @user)}>"}.join(' ') end if block_given? @@ -716,30 +723,28 @@ 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, user) 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) - end + hash << user.id if user host = Setting.mail_from.to_s.strip.gsub(%r{^.*@|>}, '') host = "#{::Socket.gethostname}.redmine" if host.empty? "#{hash.join('.')}@#{host}" 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, user) + token_for(object, user) 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, user) + token_for(object, user) end def message_id(object) @@ -751,3 +756,4 @@ class Mailer < ActionMailer::Base @references_objects << object end end + diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb index f22f532f4..4a04e29af 100644 --- a/test/unit/mailer_test.rb +++ b/test/unit/mailer_test.rb @@ -293,8 +293,9 @@ class MailerTest < ActiveSupport::TestCase issue = Issue.find(2) 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 + uid = destination_user(mail).id + assert_include "redmine.issue-2.20060719190421.#{uid}@example.net", mail.message_id + assert_include "redmine.issue-2.20060719190421.#{uid}@example.net", mail.references end def test_issue_edit_message_id @@ -303,8 +304,9 @@ class MailerTest < ActiveSupport::TestCase 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 + uid = destination_user(mail).id + assert_match /^redmine\.journal-3\.\d+\.#{uid}@example\.net/, mail.message_id + assert_include "redmine.issue-2.20060719190421.#{uid}@example.net", mail.references assert_select_email do # link to the update assert_select "a[href=?]", @@ -316,8 +318,9 @@ class MailerTest < ActiveSupport::TestCase message = Message.find(1) Mailer.deliver_message_posted(message) 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.references + uid = destination_user(mail).id + assert_include "redmine.message-1.20070512151532.#{uid}@example.net", mail.message_id + assert_include "redmine.message-1.20070512151532.#{uid}@example.net", mail.references assert_select_email do # link to the message assert_select "a[href=?]", @@ -330,8 +333,9 @@ class MailerTest < ActiveSupport::TestCase message = Message.find(3) Mailer.deliver_message_posted(message) mail = last_email - assert_match /^redmine\.message-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id - assert_include "redmine.message-1.20070512151532@example.net", mail.references + uid = destination_user(mail).id + assert_include "redmine.message-3.20070512151802.#{uid}@example.net", mail.message_id + assert_include "redmine.message-1.20070512151532.#{uid}@example.net", mail.references assert_select_email do # link to the reply assert_select "a[href=?]", @@ -745,7 +749,8 @@ class MailerTest < ActiveSupport::TestCase 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+\.3@redmine.org\z/, + Mailer.token_for(Issue.generate!, User.find(3)) end end @@ -897,4 +902,8 @@ class MailerTest < ActiveSupport::TestCase def html_part last_email.parts.detect {|part| part.content_type.include?('text/html')} end + + def destination_user(mail) + EmailAddress.where(:address => [mail.to, mail.cc, mail.bcc].flatten).map(&:user).first + end end