Commit 780d868fec936327cbdf688cf6e2571b07d780c9

Authored by Jacob Vosmaer
1 parent c1ff1fde

Revert "Merge branch 'fix-email-threading' into 'master'"

This reverts commit 97fd990ecde387290be269ef7daafa5761f94af6, reversing
changes made to f451a697e0c018359e6d8ff3aaba4eb0484c4bee.

Conflicts:
	app/mailers/emails/notes.rb
	app/mailers/emails/projects.rb
app/mailers/emails/groups.rb
... ... @@ -4,7 +4,7 @@ module Emails
4 4 @membership = UsersGroup.find(user_group_id)
5 5 @group = @membership.group
6 6 @target_url = group_url(@group)
7   - mail(cc: @membership.user.email,
  7 + mail(to: @membership.user.email,
8 8 subject: subject("Access to group was granted"))
9 9 end
10 10 end
... ...
app/mailers/emails/issues.rb
... ... @@ -4,10 +4,10 @@ module Emails
4 4 @issue = Issue.find(issue_id)
5 5 @project = @issue.project
6 6 @target_url = project_issue_url(@project, @issue)
7   - mail_new_thread(@issue,
8   - from: sender(@issue.author_id),
9   - cc: recipient(recipient_id),
10   - subject: subject("#{@issue.title} (##{@issue.iid})"))
  7 + set_message_id("issue_#{issue_id}")
  8 + mail(from: sender(@issue.author_id),
  9 + to: recipient(recipient_id),
  10 + subject: subject("#{@issue.title} (##{@issue.iid})"))
11 11 end
12 12  
13 13 def reassigned_issue_email(recipient_id, issue_id, previous_assignee_id, updated_by_user_id)
... ... @@ -15,10 +15,10 @@ module Emails
15 15 @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id
16 16 @project = @issue.project
17 17 @target_url = project_issue_url(@project, @issue)
18   - mail_answer_thread(@issue,
19   - from: sender(updated_by_user_id),
20   - cc: recipient(recipient_id),
21   - subject: subject("#{@issue.title} (##{@issue.iid})"))
  18 + set_reference("issue_#{issue_id}")
  19 + mail(from: sender(updated_by_user_id),
  20 + to: recipient(recipient_id),
  21 + subject: subject("#{@issue.title} (##{@issue.iid})"))
22 22 end
23 23  
24 24 def closed_issue_email(recipient_id, issue_id, updated_by_user_id)
... ... @@ -26,10 +26,10 @@ module Emails
26 26 @project = @issue.project
27 27 @updated_by = User.find updated_by_user_id
28 28 @target_url = project_issue_url(@project, @issue)
29   - mail_answer_thread(@issue,
30   - from: sender(updated_by_user_id),
31   - cc: recipient(recipient_id),
32   - subject: subject("#{@issue.title} (##{@issue.iid})"))
  29 + set_reference("issue_#{issue_id}")
  30 + mail(from: sender(updated_by_user_id),
  31 + to: recipient(recipient_id),
  32 + subject: subject("#{@issue.title} (##{@issue.iid})"))
33 33 end
34 34  
35 35 def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id)
... ... @@ -38,10 +38,10 @@ module Emails
38 38 @project = @issue.project
39 39 @updated_by = User.find updated_by_user_id
40 40 @target_url = project_issue_url(@project, @issue)
41   - mail_answer_thread(@issue,
42   - from: sender(updated_by_user_id),
43   - cc: recipient(recipient_id),
44   - subject: subject("#{@issue.title} (##{@issue.iid})"))
  41 + set_reference("issue_#{issue_id}")
  42 + mail(from: sender(updated_by_user_id),
  43 + to: recipient(recipient_id),
  44 + subject: subject("#{@issue.title} (##{@issue.iid})"))
45 45 end
46 46 end
47 47 end
... ...
app/mailers/emails/merge_requests.rb
... ... @@ -4,10 +4,10 @@ module Emails
4 4 @merge_request = MergeRequest.find(merge_request_id)
5 5 @project = @merge_request.project
6 6 @target_url = project_merge_request_url(@project, @merge_request)
7   - mail_new_thread(@merge_request,
8   - from: sender(@merge_request.author_id),
9   - cc: recipient(recipient_id),
10   - subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
  7 + set_message_id("merge_request_#{merge_request_id}")
  8 + mail(from: sender(@merge_request.author_id),
  9 + to: recipient(recipient_id),
  10 + subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
11 11 end
12 12  
13 13 def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_id, updated_by_user_id)
... ... @@ -15,10 +15,10 @@ module Emails
15 15 @previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id
16 16 @project = @merge_request.project
17 17 @target_url = project_merge_request_url(@project, @merge_request)
18   - mail_answer_thread(@merge_request,
19   - from: sender(updated_by_user_id),
20   - cc: recipient(recipient_id),
21   - subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
  18 + set_reference("merge_request_#{merge_request_id}")
  19 + mail(from: sender(updated_by_user_id),
  20 + to: recipient(recipient_id),
  21 + subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
22 22 end
23 23  
24 24 def closed_merge_request_email(recipient_id, merge_request_id, updated_by_user_id)
... ... @@ -26,20 +26,20 @@ module Emails
26 26 @updated_by = User.find updated_by_user_id
27 27 @project = @merge_request.project
28 28 @target_url = project_merge_request_url(@project, @merge_request)
29   - mail_answer_thread(@merge_request,
30   - from: sender(updated_by_user_id),
31   - cc: recipient(recipient_id),
32   - subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
  29 + set_reference("merge_request_#{merge_request_id}")
  30 + mail(from: sender(updated_by_user_id),
  31 + to: recipient(recipient_id),
  32 + subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
33 33 end
34 34  
35 35 def merged_merge_request_email(recipient_id, merge_request_id, updated_by_user_id)
36 36 @merge_request = MergeRequest.find(merge_request_id)
37 37 @project = @merge_request.project
38 38 @target_url = project_merge_request_url(@project, @merge_request)
39   - mail_answer_thread(@merge_request,
40   - from: sender(updated_by_user_id),
41   - cc: recipient(recipient_id),
42   - subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
  39 + set_reference("merge_request_#{merge_request_id}")
  40 + mail(from: sender(updated_by_user_id),
  41 + to: recipient(recipient_id),
  42 + subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
43 43 end
44 44 end
45 45  
... ...
app/mailers/emails/notes.rb
... ... @@ -5,10 +5,9 @@ module Emails
5 5 @commit = @note.noteable
6 6 @project = @note.project
7 7 @target_url = project_commit_url(@project, @commit, anchor: "note_#{@note.id}")
8   - mail_answer_thread(@commit,
9   - from: sender(@note.author_id),
10   - cc: recipient(recipient_id),
11   - subject: subject("#{@commit.title} (#{@commit.short_id})"))
  8 + mail(from: sender(@note.author_id),
  9 + to: recipient(recipient_id),
  10 + subject: subject("#{@commit.title} (#{@commit.short_id})"))
12 11 end
13 12  
14 13 def note_issue_email(recipient_id, note_id)
... ... @@ -16,10 +15,10 @@ module Emails
16 15 @issue = @note.noteable
17 16 @project = @note.project
18 17 @target_url = project_issue_url(@project, @issue, anchor: "note_#{@note.id}")
19   - mail_answer_thread(@issue,
20   - from: sender(@note.author_id),
21   - cc: recipient(recipient_id),
22   - subject: subject("#{@issue.title} (##{@issue.iid})"))
  18 + set_reference("issue_#{@issue.id}")
  19 + mail(from: sender(@note.author_id),
  20 + to: recipient(recipient_id),
  21 + subject: subject("#{@issue.title} (##{@issue.iid})"))
23 22 end
24 23  
25 24 def note_merge_request_email(recipient_id, note_id)
... ... @@ -27,10 +26,10 @@ module Emails
27 26 @merge_request = @note.noteable
28 27 @project = @note.project
29 28 @target_url = project_merge_request_url(@project, @merge_request, anchor: "note_#{@note.id}")
30   - mail_answer_thread(@merge_request,
31   - from: sender(@note.author_id),
32   - cc: recipient(recipient_id),
33   - subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
  29 + set_reference("merge_request_#{@merge_request.id}")
  30 + mail(from: sender(@note.author_id),
  31 + to: recipient(recipient_id),
  32 + subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
34 33 end
35 34 end
36 35 end
... ...
app/mailers/emails/projects.rb
... ... @@ -4,7 +4,7 @@ module Emails
4 4 @users_project = UsersProject.find user_project_id
5 5 @project = @users_project.project
6 6 @target_url = project_url(@project)
7   - mail(cc: @users_project.user.email,
  7 + mail(to: @users_project.user.email,
8 8 subject: subject("Access to project was granted"))
9 9 end
10 10  
... ... @@ -12,7 +12,7 @@ module Emails
12 12 @user = User.find user_id
13 13 @project = Project.find project_id
14 14 @target_url = project_url(@project)
15   - mail(cc: @user.email,
  15 + mail(to: @user.email,
16 16 subject: subject("Project was moved"))
17 17 end
18 18  
... ... @@ -32,7 +32,7 @@ module Emails
32 32 end
33 33  
34 34 mail(from: sender(author_id),
35   - cc: recipient,
  35 + to: recipient,
36 36 subject: subject(@subject))
37 37 end
38 38 end
... ...
app/mailers/notify.rb
1 1 class Notify < ActionMailer::Base
2   - include ActionDispatch::Routing::PolymorphicRoutes
3   -
4 2 include Emails::Issues
5 3 include Emails::MergeRequests
6 4 include Emails::Notes
... ... @@ -18,7 +16,6 @@ class Notify &lt; ActionMailer::Base
18 16 default_url_options[:script_name] = Gitlab.config.gitlab.relative_url_root
19 17  
20 18 default from: Proc.new { default_sender_address.format }
21   - default to: Proc.new { project_sender_address.format }
22 19 default reply_to: "noreply@#{Gitlab.config.gitlab.host}"
23 20  
24 21 # Just send email with 2 seconds delay
... ... @@ -35,17 +32,6 @@ class Notify &lt; ActionMailer::Base
35 32 address
36 33 end
37 34  
38   - # The default email address to send emails to. Includes the project name if possible.
39   - def project_sender_address
40   - if @project
41   - address = default_sender_address
42   - address.display_name = @project.name_with_namespace
43   - address
44   - else
45   - default_sender_address
46   - end
47   - end
48   -
49 35 # Return an email address that displays the name of the sender.
50 36 # Only the displayed name changes; the actual email address is always the same.
51 37 def sender(sender_id)
... ... @@ -67,6 +53,14 @@ class Notify &lt; ActionMailer::Base
67 53 end
68 54 end
69 55  
  56 + # Set the Message-ID header field
  57 + #
  58 + # local_part - The local part of the message ID
  59 + #
  60 + def set_message_id(local_part)
  61 + headers["Message-ID"] = "<#{local_part}@#{Gitlab.config.gitlab.host}>"
  62 + end
  63 +
70 64 # Set the References header field
71 65 #
72 66 # local_part - The local part of the referenced message ID
... ... @@ -99,48 +93,4 @@ class Notify &lt; ActionMailer::Base
99 93 subject << extra.join(' | ') if extra.present?
100 94 subject
101 95 end
102   -
103   - # Return a string suitable for inclusion in the 'Message-Id' mail header.
104   - #
105   - # The message-id is generated from the unique URL to a model object.
106   - def message_id(model)
107   - model_name = model.class.model_name.singular_route_key
108   - "<#{model_name}_#{model.id}@#{Gitlab.config.gitlab.host}>"
109   - end
110   -
111   - # Send an email that starts a new conversation thread,
112   - # with headers suitable for grouping by thread in email clients.
113   - #
114   - # See: mail_answer_thread
115   - def mail_new_thread(model, headers = {}, &block)
116   - raise ArgumentError, '"To:" header will be overwritten; use "Cc:" or "Bcc:"' unless headers[:to].nil?
117   - headers[:to] = project_sender_address.format
118   -
119   - headers['Message-ID'] = message_id(model)
120   -
121   - mail(headers, &block)
122   - end
123   -
124   - # Send an email that responds to an existing conversation thread,
125   - # with headers suitable for grouping by thread in email clients.
126   - #
127   - # For grouping emails by thread, email clients heuristics require the answers to:
128   - #
129   - # * have a subject that begin by 'Re: '
130   - # * have a 'In-Reply-To' or 'References' header that references the original 'Message-ID'
131   - # * have stable 'From' and 'To' headers between messages of the same thread
132   - #
133   - def mail_answer_thread(model, headers = {}, &block)
134   - raise ArgumentError, '"To:" header will be overwritten; use "Cc:" or "Bcc:"' unless headers[:to].nil?
135   - headers[:to] = project_sender_address.format
136   -
137   - headers['In-Reply-To'] = message_id(model)
138   - headers['References'] = message_id(model)
139   -
140   - if (headers[:subject])
141   - headers[:subject].prepend('Re: ')
142   - end
143   -
144   - mail(headers, &block)
145   - end
146 96 end
... ...
spec/mailers/notify_spec.rb
... ... @@ -10,7 +10,7 @@ describe Notify do
10 10  
11 11 shared_examples 'a multiple recipients email' do
12 12 it 'is sent to the given recipient' do
13   - should cc_to recipient.email
  13 + should deliver_to recipient.email
14 14 end
15 15 end
16 16  
... ... @@ -22,23 +22,6 @@ describe Notify do
22 22 end
23 23 end
24 24  
25   - shared_examples 'an email starting a new thread' do |message_id_prefix|
26   - it 'has a discussion identifier' do
27   - should have_header 'Message-ID', /<#{message_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
28   - end
29   - end
30   -
31   - shared_examples 'an answer to an existing thread' do |thread_id_prefix|
32   - it 'has a subject that begins with Re: ' do
33   - should have_subject /^Re: /
34   - end
35   -
36   - it 'has headers that reference an existing thread' do
37   - should have_header 'References', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
38   - should have_header 'In-Reply-To', /<#{thread_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
39   - end
40   - end
41   -
42 25 describe 'for new users, the email' do
43 26 let(:example_site_path) { root_path }
44 27 let(:new_user) { create(:user, email: 'newguy@example.com', created_by_id: 1) }
... ... @@ -158,7 +141,7 @@ describe Notify do
158 141 end
159 142  
160 143 it 'is sent to the assignee' do
161   - should cc_to assignee.email
  144 + should deliver_to assignee.email
162 145 end
163 146 end
164 147  
... ... @@ -170,7 +153,6 @@ describe Notify do
170 153 subject { Notify.new_issue_email(issue.assignee_id, issue.id) }
171 154  
172 155 it_behaves_like 'an assignee email'
173   - it_behaves_like 'an email starting a new thread', 'issue'
174 156  
175 157 it 'has the correct subject' do
176 158 should have_subject /#{project.name} \| #{issue.title} \(##{issue.iid}\)/
... ... @@ -179,6 +161,10 @@ describe Notify do
179 161 it 'contains a link to the new issue' do
180 162 should have_body_text /#{project_issue_path project, issue}/
181 163 end
  164 +
  165 + it 'has the correct message-id set' do
  166 + should have_header 'Message-ID', "<issue_#{issue.id}@#{Gitlab.config.gitlab.host}>"
  167 + end
182 168 end
183 169  
184 170 describe 'that are new with a description' do
... ... @@ -193,7 +179,6 @@ describe Notify do
193 179 subject { Notify.reassigned_issue_email(recipient.id, issue.id, previous_assignee.id, current_user) }
194 180  
195 181 it_behaves_like 'a multiple recipients email'
196   - it_behaves_like 'an answer to an existing thread', 'issue'
197 182  
198 183 it 'is sent as the author' do
199 184 sender = subject.header[:from].addrs[0]
... ... @@ -216,14 +201,16 @@ describe Notify do
216 201 it 'contains a link to the issue' do
217 202 should have_body_text /#{project_issue_path project, issue}/
218 203 end
  204 +
  205 + it 'has the correct reference set' do
  206 + should have_header 'References', "<issue_#{issue.id}@#{Gitlab.config.gitlab.host}>"
  207 + end
219 208 end
220 209  
221 210 describe 'status changed' do
222 211 let(:status) { 'closed' }
223 212 subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) }
224 213  
225   - it_behaves_like 'an answer to an existing thread', 'issue'
226   -
227 214 it 'is sent as the author' do
228 215 sender = subject.header[:from].addrs[0]
229 216 sender.display_name.should eq(current_user.name)
... ... @@ -245,6 +232,10 @@ describe Notify do
245 232 it 'contains a link to the issue' do
246 233 should have_body_text /#{project_issue_path project, issue}/
247 234 end
  235 +
  236 + it 'has the correct reference set' do
  237 + should have_header 'References', "<issue_#{issue.id}@#{Gitlab.config.gitlab.host}>"
  238 + end
248 239 end
249 240  
250 241 end
... ... @@ -258,7 +249,6 @@ describe Notify do
258 249 subject { Notify.new_merge_request_email(merge_request.assignee_id, merge_request.id) }
259 250  
260 251 it_behaves_like 'an assignee email'
261   - it_behaves_like 'an email starting a new thread', 'merge_request'
262 252  
263 253 it 'has the correct subject' do
264 254 should have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
... ... @@ -293,7 +283,6 @@ describe Notify do
293 283 subject { Notify.reassigned_merge_request_email(recipient.id, merge_request.id, previous_assignee.id, current_user.id) }
294 284  
295 285 it_behaves_like 'a multiple recipients email'
296   - it_behaves_like 'an answer to an existing thread', 'merge_request'
297 286  
298 287 it 'is sent as the author' do
299 288 sender = subject.header[:from].addrs[0]
... ... @@ -322,7 +311,6 @@ describe Notify do
322 311 subject { Notify.merged_merge_request_email(recipient.id, merge_request.id, merge_author.id) }
323 312  
324 313 it_behaves_like 'a multiple recipients email'
325   - it_behaves_like 'an answer to an existing thread', 'merge_request'
326 314  
327 315 it 'is sent as the merge author' do
328 316 sender = subject.header[:from].addrs[0]
... ... @@ -341,6 +329,10 @@ describe Notify do
341 329 it 'contains a link to the merge request' do
342 330 should have_body_text /#{project_merge_request_path project, merge_request}/
343 331 end
  332 +
  333 + it 'has the correct reference set' do
  334 + should have_header 'References', "<merge_request_#{merge_request.id}@#{Gitlab.config.gitlab.host}>"
  335 + end
344 336 end
345 337 end
346 338 end
... ... @@ -402,7 +394,7 @@ describe Notify do
402 394 end
403 395  
404 396 it 'is sent to the given recipient' do
405   - should cc_to recipient.email
  397 + should deliver_to recipient.email
406 398 end
407 399  
408 400 it 'contains the message from the note' do
... ... @@ -418,7 +410,6 @@ describe Notify do
418 410 subject { Notify.note_commit_email(recipient.id, note.id) }
419 411  
420 412 it_behaves_like 'a note email'
421   - it_behaves_like 'an answer to an existing thread', 'commits'
422 413  
423 414 it 'has the correct subject' do
424 415 should have_subject /#{commit.title} \(#{commit.short_id}\)/
... ... @@ -437,7 +428,6 @@ describe Notify do
437 428 subject { Notify.note_merge_request_email(recipient.id, note.id) }
438 429  
439 430 it_behaves_like 'a note email'
440   - it_behaves_like 'an answer to an existing thread', 'merge_request'
441 431  
442 432 it 'has the correct subject' do
443 433 should have_subject /#{merge_request.title} \(##{merge_request.iid}\)/
... ... @@ -456,7 +446,6 @@ describe Notify do
456 446 subject { Notify.note_issue_email(recipient.id, note.id) }
457 447  
458 448 it_behaves_like 'a note email'
459   - it_behaves_like 'an answer to an existing thread', 'issue'
460 449  
461 450 it 'has the correct subject' do
462 451 should have_subject /#{issue.title} \(##{issue.iid}\)/
... ... @@ -533,7 +522,7 @@ describe Notify do
533 522 end
534 523  
535 524 it 'is sent to recipient' do
536   - should cc_to 'devs@company.name'
  525 + should deliver_to 'devs@company.name'
537 526 end
538 527  
539 528 it 'has the correct subject' do
... ... @@ -569,7 +558,7 @@ describe Notify do
569 558 end
570 559  
571 560 it 'is sent to recipient' do
572   - should cc_to 'devs@company.name'
  561 + should deliver_to 'devs@company.name'
573 562 end
574 563  
575 564 it 'has the correct subject' do
... ...
spec/services/issues/close_service_spec.rb
... ... @@ -22,7 +22,7 @@ describe Issues::CloseService do
22 22  
23 23 it 'should send email to user2 about assign of new issue' do
24 24 email = ActionMailer::Base.deliveries.last
25   - email.cc.first.should == user2.email
  25 + email.to.first.should == user2.email
26 26 email.subject.should include(issue.title)
27 27 end
28 28  
... ...
spec/services/issues/update_service_spec.rb
... ... @@ -31,7 +31,7 @@ describe Issues::UpdateService do
31 31  
32 32 it 'should send email to user2 about assign of new issue' do
33 33 email = ActionMailer::Base.deliveries.last
34   - email.cc.first.should == user2.email
  34 + email.to.first.should == user2.email
35 35 email.subject.should include(issue.title)
36 36 end
37 37  
... ...
spec/services/merge_requests/close_service_spec.rb
... ... @@ -22,7 +22,7 @@ describe MergeRequests::CloseService do
22 22  
23 23 it 'should send email to user2 about assign of new merge_request' do
24 24 email = ActionMailer::Base.deliveries.last
25   - email.cc.first.should == user2.email
  25 + email.to.first.should == user2.email
26 26 email.subject.should include(merge_request.title)
27 27 end
28 28  
... ...
spec/services/merge_requests/update_service_spec.rb
... ... @@ -31,7 +31,7 @@ describe MergeRequests::UpdateService do
31 31  
32 32 it 'should send email to user2 about assign of new merge_request' do
33 33 email = ActionMailer::Base.deliveries.last
34   - email.cc.first.should == user2.email
  34 + email.to.first.should == user2.email
35 35 email.subject.should include(merge_request.title)
36 36 end
37 37  
... ...