Defect #17096 » 17096-fix-emails-threading-v2.patch
app/models/mailer.rb (作業コピー) | ||
---|---|---|
137 | 137 |
redmine_headers 'Project' => document.project.identifier |
138 | 138 |
@author = author |
139 | 139 |
@document = document |
140 |
@user = user |
|
140 | 141 |
@document_url = url_for(:controller => 'documents', :action => 'show', :id => document) |
141 | 142 |
mail :to => user, |
142 | 143 |
:subject => "[#{document.project.name}] #{l(:label_document_new)}: #{document.title}" |
... | ... | |
172 | 173 |
end |
173 | 174 |
redmine_headers 'Project' => container.project.identifier |
174 | 175 |
@attachments = attachments |
176 |
@user = user |
|
175 | 177 |
@added_to = added_to |
176 | 178 |
@added_to_url = added_to_url |
177 | 179 |
mail :to => user, |
... | ... | |
203 | 205 |
message_id news |
204 | 206 |
references news |
205 | 207 |
@news = news |
208 |
@user = user |
|
206 | 209 |
@news_url = url_for(:controller => 'news', :action => 'show', :id => news) |
207 | 210 |
mail :to => user, |
208 | 211 |
:subject => "[#{news.project.name}] #{l(:label_news)}: #{news.title}" |
... | ... | |
228 | 231 |
references news |
229 | 232 |
@news = news |
230 | 233 |
@comment = comment |
234 |
@user = user |
|
231 | 235 |
@news_url = url_for(:controller => 'news', :action => 'show', :id => news) |
232 | 236 |
mail :to => user, |
233 | 237 |
:subject => "Re: [#{news.project.name}] #{l(:label_news)}: #{news.title}" |
... | ... | |
253 | 257 |
message_id message |
254 | 258 |
references message.root |
255 | 259 |
@message = message |
260 |
@user = user |
|
256 | 261 |
@message_url = url_for(message.event_url) |
257 | 262 |
mail :to => user, |
258 | 263 |
:subject => "[#{message.board.project.name} - #{message.board.name} - msg#{message.root.id}] #{message.subject}" |
... | ... | |
279 | 284 |
@author = wiki_content.author |
280 | 285 |
message_id wiki_content |
281 | 286 |
@wiki_content = wiki_content |
287 |
@user = user |
|
282 | 288 |
@wiki_content_url = url_for(:controller => 'wiki', :action => 'show', |
283 | 289 |
:project_id => wiki_content.project, |
284 | 290 |
:id => wiki_content.page.title) |
... | ... | |
304 | 310 |
@author = wiki_content.author |
305 | 311 |
message_id wiki_content |
306 | 312 |
@wiki_content = wiki_content |
313 |
@user = user |
|
307 | 314 |
@wiki_content_url = url_for(:controller => 'wiki', :action => 'show', |
308 | 315 |
:project_id => wiki_content.project, |
309 | 316 |
:id => wiki_content.page.title) |
... | ... | |
662 | 669 |
end |
663 | 670 | |
664 | 671 |
if @message_id_object |
665 |
headers[:message_id] = "<#{self.class.message_id_for(@message_id_object)}>" |
|
672 |
headers[:message_id] = "<#{self.class.message_id_for(@message_id_object, @user)}>"
|
|
666 | 673 |
end |
667 | 674 |
if @references_objects |
668 |
headers[:references] = @references_objects.collect {|o| "<#{self.class.references_for(o)}>"}.join(' ') |
|
675 |
headers[:references] = @references_objects.collect {|o| "<#{self.class.references_for(o, @user)}>"}.join(' ')
|
|
669 | 676 |
end |
670 | 677 | |
671 | 678 |
if block_given? |
... | ... | |
719 | 726 |
h.each { |k,v| headers["X-Redmine-#{k}"] = v.to_s } |
720 | 727 |
end |
721 | 728 | |
722 |
def self.token_for(object, rand=true)
|
|
729 |
def self.token_for(object, user)
|
|
723 | 730 |
timestamp = object.send(object.respond_to?(:created_on) ? :created_on : :updated_on) |
724 | 731 |
hash = [ |
725 | 732 |
"redmine", |
726 | 733 |
"#{object.class.name.demodulize.underscore}-#{object.id}", |
727 | 734 |
timestamp.utc.strftime("%Y%m%d%H%M%S") |
728 | 735 |
] |
729 |
if rand |
|
730 |
hash << Redmine::Utils.random_hex(8) |
|
731 |
end |
|
736 |
hash << user.id if user |
|
732 | 737 |
host = Setting.mail_from.to_s.strip.gsub(%r{^.*@|>}, '') |
733 | 738 |
host = "#{::Socket.gethostname}.redmine" if host.empty? |
734 | 739 |
"#{hash.join('.')}@#{host}" |
735 | 740 |
end |
736 | 741 | |
737 | 742 |
# Returns a Message-Id for the given object |
738 |
def self.message_id_for(object) |
|
739 |
token_for(object, true)
|
|
743 |
def self.message_id_for(object, user)
|
|
744 |
token_for(object, user)
|
|
740 | 745 |
end |
741 | 746 | |
742 | 747 |
# Returns a uniq token for a given object referenced by all notifications |
743 | 748 |
# related to this object |
744 |
def self.references_for(object) |
|
745 |
token_for(object, false)
|
|
749 |
def self.references_for(object, user)
|
|
750 |
token_for(object, user)
|
|
746 | 751 |
end |
747 | 752 | |
748 | 753 |
def message_id(object) |
... | ... | |
754 | 759 |
@references_objects << object |
755 | 760 |
end |
756 | 761 |
end |
762 |
test/unit/mailer_test.rb (作業コピー) | ||
---|---|---|
296 | 296 |
issue = Issue.find(2) |
297 | 297 |
Mailer.deliver_issue_add(issue) |
298 | 298 |
mail = last_email |
299 |
assert_match /^redmine\.issue-2\.20060719190421\.[a-f0-9]+@example\.net/, mail.message_id |
|
300 |
assert_include "redmine.issue-2.20060719190421@example.net", mail.references |
|
299 |
uid = destination_user(mail).id |
|
300 |
assert_include "redmine.issue-2.20060719190421.#{uid}@example.net", mail.message_id |
|
301 |
assert_include "redmine.issue-2.20060719190421.#{uid}@example.net", mail.references |
|
301 | 302 |
end |
302 | 303 | |
303 | 304 |
def test_issue_edit_message_id |
... | ... | |
306 | 307 | |
307 | 308 |
Mailer.deliver_issue_edit(journal) |
308 | 309 |
mail = last_email |
309 |
assert_match /^redmine\.journal-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id |
|
310 |
assert_include "redmine.issue-2.20060719190421@example.net", mail.references |
|
310 |
uid = destination_user(mail).id |
|
311 |
assert_match /^redmine\.journal-3\.\d+\.#{uid}@example\.net/, mail.message_id |
|
312 |
assert_include "redmine.issue-2.20060719190421.#{uid}@example.net", mail.references |
|
311 | 313 |
assert_select_email do |
312 | 314 |
# link to the update |
313 | 315 |
assert_select "a[href=?]", |
... | ... | |
319 | 321 |
message = Message.find(1) |
320 | 322 |
Mailer.deliver_message_posted(message) |
321 | 323 |
mail = last_email |
322 |
assert_match /^redmine\.message-1\.\d+\.[a-f0-9]+@example\.net/, mail.message_id |
|
323 |
assert_include "redmine.message-1.20070512151532@example.net", mail.references |
|
324 |
uid = destination_user(mail).id |
|
325 |
assert_include "redmine.message-1.20070512151532.#{uid}@example.net", mail.message_id |
|
326 |
assert_include "redmine.message-1.20070512151532.#{uid}@example.net", mail.references |
|
324 | 327 |
assert_select_email do |
325 | 328 |
# link to the message |
326 | 329 |
assert_select "a[href=?]", |
... | ... | |
333 | 336 |
message = Message.find(3) |
334 | 337 |
Mailer.deliver_message_posted(message) |
335 | 338 |
mail = last_email |
336 |
assert_match /^redmine\.message-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id |
|
337 |
assert_include "redmine.message-1.20070512151532@example.net", mail.references |
|
339 |
uid = destination_user(mail).id |
|
340 |
assert_include "redmine.message-3.20070512151802.#{uid}@example.net", mail.message_id |
|
341 |
assert_include "redmine.message-1.20070512151532.#{uid}@example.net", mail.references |
|
338 | 342 |
assert_select_email do |
339 | 343 |
# link to the reply |
340 | 344 |
assert_select "a[href=?]", |
... | ... | |
348 | 352 |
issue = Issue.find(3) |
349 | 353 |
%w(UTC Paris Tokyo).each do |zone| |
350 | 354 |
Time.zone = zone |
351 |
assert_match /^redmine\.issue-3\.20060719190727\.[a-f0-9]+@example\.net/, Mailer.token_for(issue)
|
|
355 |
assert_match /^redmine\.issue-3\.20060719190727\.1@example\.net/, Mailer.token_for(issue, User.find(1))
|
|
352 | 356 |
end |
353 | 357 |
ensure |
354 | 358 |
Time.zone = zone_was |
... | ... | |
803 | 807 | |
804 | 808 |
def test_token_for_should_strip_trailing_gt_from_address_with_full_name |
805 | 809 |
with_settings :mail_from => "Redmine Mailer<no-reply@redmine.org>" do |
806 |
assert_match /\Aredmine.issue-\d+\.\d+\.[0-9a-f]+@redmine.org\z/, Mailer.token_for(Issue.generate!) |
|
810 |
assert_match /\Aredmine.issue-\d+\.\d+\.3@redmine.org\z/, |
|
811 |
Mailer.token_for(Issue.generate!, User.find(3)) |
|
807 | 812 |
end |
808 | 813 |
end |
809 | 814 | |
... | ... | |
955 | 960 |
def html_part |
956 | 961 |
last_email.parts.detect {|part| part.content_type.include?('text/html')} |
957 | 962 |
end |
963 | ||
964 |
def destination_user(mail) |
|
965 |
EmailAddress.where(:address => [mail.to, mail.cc, mail.bcc].flatten).map(&:user).first |
|
966 |
end |
|
958 | 967 |
end |
- « Previous
- 1
- 2
- 3
- 4
- Next »