Defect #17096 » mail-17096-20140608.diff
| app/models/mailer.rb | ||
|---|---|---|
| 34 | 34 |
'Issue-Author' => issue.author.login |
| 35 | 35 |
redmine_headers 'Issue-Assignee' => issue.assigned_to.login if issue.assigned_to |
| 36 | 36 |
message_id issue |
| 37 |
references issue |
|
| 38 | 37 |
@author = issue.author |
| 39 | 38 |
@issue = issue |
| 40 | 39 |
@users = to_users + cc_users |
| ... | ... | |
| 398 | 397 |
end |
| 399 | 398 | |
| 400 | 399 |
if @message_id_object |
| 401 |
headers[:message_id] = "<#{self.class.message_id_for(@message_id_object)}>"
|
|
| 400 |
headers[:message_id] = "<#{self.class.message_id_for(@message_id_object, @users, @issue)}>"
|
|
| 402 | 401 |
end |
| 403 | 402 |
if @references_objects |
| 404 |
headers[:references] = @references_objects.collect {|o| "<#{self.class.references_for(o)}>"}.join(' ')
|
|
| 403 |
headers[:references] = |
|
| 404 |
@references_objects.collect {|o| "<#{self.class.references_for(o, @users, @issue)}>"}.join(' ')
|
|
| 405 | 405 |
end |
| 406 | 406 | |
| 407 | 407 |
m = if block_given? |
| ... | ... | |
| 454 | 454 |
h.each { |k,v| headers["X-Redmine-#{k}"] = v.to_s }
|
| 455 | 455 |
end |
| 456 | 456 | |
| 457 |
def self.token_for(object, rand=true)
|
|
| 457 |
def self.token_for(object, users, issue)
|
|
| 458 | 458 |
timestamp = object.send(object.respond_to?(:created_on) ? :created_on : :updated_on) |
| 459 | 459 |
hash = [ |
| 460 | 460 |
"redmine", |
| 461 | 461 |
"#{object.class.name.demodulize.underscore}-#{object.id}",
|
| 462 | 462 |
timestamp.strftime("%Y%m%d%H%M%S")
|
| 463 | 463 |
] |
| 464 |
if rand |
|
| 465 |
hash << Redmine::Utils.random_hex(8) |
|
| 464 |
if users && users.present? && issue |
|
| 465 |
ids = issue.visible_custom_field_values(users.first).map(&:custom_field_id).sort |
|
| 466 |
if ids.present? |
|
| 467 |
hash << Digest::SHA1.hexdigest(ids.join(","))[0, 8]
|
|
| 468 |
end |
|
| 466 | 469 |
end |
| 467 | 470 |
host = Setting.mail_from.to_s.strip.gsub(%r{^.*@|>}, '')
|
| 468 | 471 |
host = "#{::Socket.gethostname}.redmine" if host.empty?
|
| ... | ... | |
| 470 | 473 |
end |
| 471 | 474 | |
| 472 | 475 |
# Returns a Message-Id for the given object |
| 473 |
def self.message_id_for(object) |
|
| 474 |
token_for(object, true)
|
|
| 476 |
def self.message_id_for(object, users, issue)
|
|
| 477 |
token_for(object, users, issue)
|
|
| 475 | 478 |
end |
| 476 | 479 | |
| 477 | 480 |
# Returns a uniq token for a given object referenced by all notifications |
| 478 | 481 |
# related to this object |
| 479 |
def self.references_for(object) |
|
| 480 |
token_for(object, false)
|
|
| 482 |
def self.references_for(object, users, issue)
|
|
| 483 |
token_for(object, users, issue)
|
|
| 481 | 484 |
end |
| 482 | 485 | |
| 483 | 486 |
def message_id(object) |
| test/unit/mailer_test.rb | ||
|---|---|---|
| 245 | 245 |
Mailer.deliver_issue_add(issue) |
| 246 | 246 |
mail = last_email |
| 247 | 247 |
assert_match /^redmine\.issue-2\.20060719190421\.[a-f0-9]+@example\.net/, mail.message_id |
| 248 |
assert_include "redmine.issue-2.20060719190421@example.net", mail.references |
|
| 249 | 248 |
end |
| 250 | 249 | |
| 251 | 250 |
def test_issue_edit_message_id |
| ... | ... | |
| 255 | 254 |
Mailer.deliver_issue_edit(journal) |
| 256 | 255 |
mail = last_email |
| 257 | 256 |
assert_match /^redmine\.journal-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id |
| 258 |
assert_include "redmine.issue-2.20060719190421@example.net", mail.references
|
|
| 257 |
assert_match /^redmine\.issue-2\.20060719190421\.[a-f0-9]+@example\.net/, mail.references
|
|
| 259 | 258 |
assert_select_email do |
| 260 | 259 |
# link to the update |
| 261 | 260 |
assert_select "a[href=?]", |
| ... | ... | |
| 267 | 266 |
message = Message.find(1) |
| 268 | 267 |
Mailer.message_posted(message).deliver |
| 269 | 268 |
mail = last_email |
| 270 |
assert_match /^redmine\.message-1\.\d+\.[a-f0-9]+@example\.net/, mail.message_id
|
|
| 269 |
assert_include "redmine.message-1.20070512151532@example.net", mail.message_id
|
|
| 271 | 270 |
assert_include "redmine.message-1.20070512151532@example.net", mail.references |
| 272 | 271 |
assert_select_email do |
| 273 | 272 |
# link to the message |
| ... | ... | |
| 281 | 280 |
message = Message.find(3) |
| 282 | 281 |
Mailer.message_posted(message).deliver |
| 283 | 282 |
mail = last_email |
| 284 |
assert_match /^redmine\.message-3\.\d+\.[a-f0-9]+@example\.net/, mail.message_id
|
|
| 283 |
assert_include "redmine.message-3.20070512151802@example.net", mail.message_id
|
|
| 285 | 284 |
assert_include "redmine.message-1.20070512151532@example.net", mail.references |
| 286 | 285 |
assert_select_email do |
| 287 | 286 |
# link to the reply |
| ... | ... | |
| 652 | 651 | |
| 653 | 652 |
def test_token_for_should_strip_trailing_gt_from_address_with_full_name |
| 654 | 653 |
with_settings :mail_from => "Redmine Mailer<no-reply@redmine.org>" do |
| 655 |
assert_match /\Aredmine.issue-\d+\.\d+\.[0-9a-f]+@redmine.org\z/, Mailer.token_for(Issue.generate!) |
|
| 654 |
assert_match /\Aredmine.issue-\d+\.\d+\.[0-9a-f]+@redmine.org\z/, |
|
| 655 |
Mailer.token_for(Issue.generate!, [User.find(1)], Issue.find(1)) |
|
| 656 | 656 |
end |
| 657 | 657 |
end |
| 658 | 658 | |