Commit 466b768bb34730ee6a24d950333c232009c34bbd

Authored by Pierre de La Morinerie
1 parent 772f2f1a

Send notification emails to the "project", and put people in Cc

This fixes email threading in Mail.app, that doesn't like when a thread
doesn't have stable recipients.

For instance, here is a possible sender-recipient combinations before:

From: A
To: Me
New issue

From: B
To: Me
Reply on new issue

From: A
To: Me
Another reply

Mail.app doesn't see B as a participant to the original email thread,
and decides to break the thread: it will group all messages from A
together, and separately all messages from B.

This commit makes the thread look like this:

From: A
To: gitlab/project
Cc: Me
New issue

From: B
To: gitlab/project
Cc: Me
Reply on new issue

From: A
To: gitlab/project
Cc: Me
Another reply

Mail.app sees a common recipient, and group the thread correctly.
app/mailers/emails/groups.rb
@@ -4,7 +4,7 @@ module Emails @@ -4,7 +4,7 @@ module Emails
4 @membership = UsersGroup.find(user_group_id) 4 @membership = UsersGroup.find(user_group_id)
5 @group = @membership.group 5 @group = @membership.group
6 @target_url = group_url(@group) 6 @target_url = group_url(@group)
7 - mail(to: @membership.user.email, 7 + mail(cc: @membership.user.email,
8 subject: subject("Access to group was granted")) 8 subject: subject("Access to group was granted"))
9 end 9 end
10 end 10 end
app/mailers/emails/issues.rb
@@ -6,7 +6,7 @@ module Emails @@ -6,7 +6,7 @@ module Emails
6 @target_url = project_issue_url(@project, @issue) 6 @target_url = project_issue_url(@project, @issue)
7 set_message_id("issue_#{issue_id}") 7 set_message_id("issue_#{issue_id}")
8 mail(from: sender(@issue.author_id), 8 mail(from: sender(@issue.author_id),
9 - to: recipient(recipient_id), 9 + cc: recipient(recipient_id),
10 subject: subject("#{@issue.title} (##{@issue.iid})")) 10 subject: subject("#{@issue.title} (##{@issue.iid})"))
11 end 11 end
12 12
@@ -17,7 +17,7 @@ module Emails @@ -17,7 +17,7 @@ module Emails
17 @target_url = project_issue_url(@project, @issue) 17 @target_url = project_issue_url(@project, @issue)
18 set_reference("issue_#{issue_id}") 18 set_reference("issue_#{issue_id}")
19 mail(from: sender(updated_by_user_id), 19 mail(from: sender(updated_by_user_id),
20 - to: recipient(recipient_id), 20 + cc: recipient(recipient_id),
21 subject: subject("#{@issue.title} (##{@issue.iid})")) 21 subject: subject("#{@issue.title} (##{@issue.iid})"))
22 end 22 end
23 23
@@ -28,7 +28,7 @@ module Emails @@ -28,7 +28,7 @@ module Emails
28 @target_url = project_issue_url(@project, @issue) 28 @target_url = project_issue_url(@project, @issue)
29 set_reference("issue_#{issue_id}") 29 set_reference("issue_#{issue_id}")
30 mail(from: sender(updated_by_user_id), 30 mail(from: sender(updated_by_user_id),
31 - to: recipient(recipient_id), 31 + cc: recipient(recipient_id),
32 subject: subject("#{@issue.title} (##{@issue.iid})")) 32 subject: subject("#{@issue.title} (##{@issue.iid})"))
33 end 33 end
34 34
@@ -40,7 +40,7 @@ module Emails @@ -40,7 +40,7 @@ module Emails
40 @target_url = project_issue_url(@project, @issue) 40 @target_url = project_issue_url(@project, @issue)
41 set_reference("issue_#{issue_id}") 41 set_reference("issue_#{issue_id}")
42 mail(from: sender(updated_by_user_id), 42 mail(from: sender(updated_by_user_id),
43 - to: recipient(recipient_id), 43 + cc: recipient(recipient_id),
44 subject: subject("#{@issue.title} (##{@issue.iid})")) 44 subject: subject("#{@issue.title} (##{@issue.iid})"))
45 end 45 end
46 end 46 end
app/mailers/emails/merge_requests.rb
@@ -6,7 +6,7 @@ module Emails @@ -6,7 +6,7 @@ module Emails
6 @target_url = project_merge_request_url(@project, @merge_request) 6 @target_url = project_merge_request_url(@project, @merge_request)
7 set_message_id("merge_request_#{merge_request_id}") 7 set_message_id("merge_request_#{merge_request_id}")
8 mail(from: sender(@merge_request.author_id), 8 mail(from: sender(@merge_request.author_id),
9 - to: recipient(recipient_id), 9 + cc: recipient(recipient_id),
10 subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) 10 subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
11 end 11 end
12 12
@@ -17,7 +17,7 @@ module Emails @@ -17,7 +17,7 @@ module Emails
17 @target_url = project_merge_request_url(@project, @merge_request) 17 @target_url = project_merge_request_url(@project, @merge_request)
18 set_reference("merge_request_#{merge_request_id}") 18 set_reference("merge_request_#{merge_request_id}")
19 mail(from: sender(updated_by_user_id), 19 mail(from: sender(updated_by_user_id),
20 - to: recipient(recipient_id), 20 + cc: recipient(recipient_id),
21 subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) 21 subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
22 end 22 end
23 23
@@ -28,7 +28,7 @@ module Emails @@ -28,7 +28,7 @@ module Emails
28 @target_url = project_merge_request_url(@project, @merge_request) 28 @target_url = project_merge_request_url(@project, @merge_request)
29 set_reference("merge_request_#{merge_request_id}") 29 set_reference("merge_request_#{merge_request_id}")
30 mail(from: sender(updated_by_user_id), 30 mail(from: sender(updated_by_user_id),
31 - to: recipient(recipient_id), 31 + cc: recipient(recipient_id),
32 subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) 32 subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
33 end 33 end
34 34
@@ -38,7 +38,7 @@ module Emails @@ -38,7 +38,7 @@ module Emails
38 @target_url = project_merge_request_url(@project, @merge_request) 38 @target_url = project_merge_request_url(@project, @merge_request)
39 set_reference("merge_request_#{merge_request_id}") 39 set_reference("merge_request_#{merge_request_id}")
40 mail(from: sender(updated_by_user_id), 40 mail(from: sender(updated_by_user_id),
41 - to: recipient(recipient_id), 41 + cc: recipient(recipient_id),
42 subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) 42 subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
43 end 43 end
44 end 44 end
app/mailers/emails/notes.rb
@@ -6,7 +6,7 @@ module Emails @@ -6,7 +6,7 @@ module Emails
6 @project = @note.project 6 @project = @note.project
7 @target_url = project_commit_url(@project, @commit, anchor: "note_#{@note.id}") 7 @target_url = project_commit_url(@project, @commit, anchor: "note_#{@note.id}")
8 mail(from: sender(@note.author_id), 8 mail(from: sender(@note.author_id),
9 - to: recipient(recipient_id), 9 + cc: recipient(recipient_id),
10 subject: subject("#{@commit.title} (#{@commit.short_id})")) 10 subject: subject("#{@commit.title} (#{@commit.short_id})"))
11 end 11 end
12 12
@@ -17,7 +17,7 @@ module Emails @@ -17,7 +17,7 @@ module Emails
17 @target_url = project_issue_url(@project, @issue, anchor: "note_#{@note.id}") 17 @target_url = project_issue_url(@project, @issue, anchor: "note_#{@note.id}")
18 set_reference("issue_#{@issue.id}") 18 set_reference("issue_#{@issue.id}")
19 mail(from: sender(@note.author_id), 19 mail(from: sender(@note.author_id),
20 - to: recipient(recipient_id), 20 + cc: recipient(recipient_id),
21 subject: subject("#{@issue.title} (##{@issue.iid})")) 21 subject: subject("#{@issue.title} (##{@issue.iid})"))
22 end 22 end
23 23
@@ -28,7 +28,7 @@ module Emails @@ -28,7 +28,7 @@ module Emails
28 @target_url = project_merge_request_url(@project, @merge_request, anchor: "note_#{@note.id}") 28 @target_url = project_merge_request_url(@project, @merge_request, anchor: "note_#{@note.id}")
29 set_reference("merge_request_#{@merge_request.id}") 29 set_reference("merge_request_#{@merge_request.id}")
30 mail(from: sender(@note.author_id), 30 mail(from: sender(@note.author_id),
31 - to: recipient(recipient_id), 31 + cc: recipient(recipient_id),
32 subject: subject("#{@merge_request.title} (##{@merge_request.iid})")) 32 subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
33 end 33 end
34 34
@@ -37,7 +37,7 @@ module Emails @@ -37,7 +37,7 @@ module Emails
37 @project = @note.project 37 @project = @note.project
38 @target_url = project_wall_url(@note.project, anchor: "note_#{@note.id}") 38 @target_url = project_wall_url(@note.project, anchor: "note_#{@note.id}")
39 mail(from: sender(@note.author_id), 39 mail(from: sender(@note.author_id),
40 - to: recipient(recipient_id), 40 + cc: recipient(recipient_id),
41 subject: subject("Note on wall")) 41 subject: subject("Note on wall"))
42 end 42 end
43 end 43 end
app/mailers/emails/projects.rb
@@ -4,7 +4,7 @@ module Emails @@ -4,7 +4,7 @@ module Emails
4 @users_project = UsersProject.find user_project_id 4 @users_project = UsersProject.find user_project_id
5 @project = @users_project.project 5 @project = @users_project.project
6 @target_url = project_url(@project) 6 @target_url = project_url(@project)
7 - mail(to: @users_project.user.email, 7 + mail(cc: @users_project.user.email,
8 subject: subject("Access to project was granted")) 8 subject: subject("Access to project was granted"))
9 end 9 end
10 10
@@ -12,7 +12,7 @@ module Emails @@ -12,7 +12,7 @@ module Emails
12 @user = User.find user_id 12 @user = User.find user_id
13 @project = Project.find project_id 13 @project = Project.find project_id
14 @target_url = project_url(@project) 14 @target_url = project_url(@project)
15 - mail(to: @user.email, 15 + mail(cc: @user.email,
16 subject: subject("Project was moved")) 16 subject: subject("Project was moved"))
17 end 17 end
18 18
@@ -30,7 +30,7 @@ module Emails @@ -30,7 +30,7 @@ module Emails
30 end 30 end
31 31
32 mail(from: sender(author_id), 32 mail(from: sender(author_id),
33 - to: recipient, 33 + cc: recipient,
34 subject: subject("New push to repository")) 34 subject: subject("New push to repository"))
35 end 35 end
36 end 36 end
app/mailers/notify.rb
1 class Notify < ActionMailer::Base 1 class Notify < ActionMailer::Base
  2 + include ActionDispatch::Routing::PolymorphicRoutes
  3 +
2 include Emails::Issues 4 include Emails::Issues
3 include Emails::MergeRequests 5 include Emails::MergeRequests
4 include Emails::Notes 6 include Emails::Notes
@@ -16,6 +18,7 @@ class Notify &lt; ActionMailer::Base @@ -16,6 +18,7 @@ class Notify &lt; ActionMailer::Base
16 default_url_options[:script_name] = Gitlab.config.gitlab.relative_url_root 18 default_url_options[:script_name] = Gitlab.config.gitlab.relative_url_root
17 19
18 default from: Proc.new { default_sender_address.format } 20 default from: Proc.new { default_sender_address.format }
  21 + default to: Proc.new { project_sender_address.format }
19 default reply_to: "noreply@#{Gitlab.config.gitlab.host}" 22 default reply_to: "noreply@#{Gitlab.config.gitlab.host}"
20 23
21 # Just send email with 2 seconds delay 24 # Just send email with 2 seconds delay
@@ -32,6 +35,17 @@ class Notify &lt; ActionMailer::Base @@ -32,6 +35,17 @@ class Notify &lt; ActionMailer::Base
32 address 35 address
33 end 36 end
34 37
  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 +
35 # Return an email address that displays the name of the sender. 49 # Return an email address that displays the name of the sender.
36 # Only the displayed name changes; the actual email address is always the same. 50 # Only the displayed name changes; the actual email address is always the same.
37 def sender(sender_id) 51 def sender(sender_id)
spec/mailers/notify_spec.rb
@@ -10,7 +10,7 @@ describe Notify do @@ -10,7 +10,7 @@ describe Notify do
10 10
11 shared_examples 'a multiple recipients email' do 11 shared_examples 'a multiple recipients email' do
12 it 'is sent to the given recipient' do 12 it 'is sent to the given recipient' do
13 - should deliver_to recipient.email 13 + should cc_to recipient.email
14 end 14 end
15 end 15 end
16 16
@@ -141,7 +141,7 @@ describe Notify do @@ -141,7 +141,7 @@ describe Notify do
141 end 141 end
142 142
143 it 'is sent to the assignee' do 143 it 'is sent to the assignee' do
144 - should deliver_to assignee.email 144 + should cc_to assignee.email
145 end 145 end
146 end 146 end
147 147
@@ -394,7 +394,7 @@ describe Notify do @@ -394,7 +394,7 @@ describe Notify do
394 end 394 end
395 395
396 it 'is sent to the given recipient' do 396 it 'is sent to the given recipient' do
397 - should deliver_to recipient.email 397 + should cc_to recipient.email
398 end 398 end
399 399
400 it 'contains the message from the note' do 400 it 'contains the message from the note' do
@@ -538,7 +538,7 @@ describe Notify do @@ -538,7 +538,7 @@ describe Notify do
538 end 538 end
539 539
540 it 'is sent to recipient' do 540 it 'is sent to recipient' do
541 - should deliver_to 'devs@company.name' 541 + should cc_to 'devs@company.name'
542 end 542 end
543 543
544 it 'has the correct subject' do 544 it 'has the correct subject' do
spec/services/issues/close_service_spec.rb
@@ -22,7 +22,7 @@ describe Issues::CloseService do @@ -22,7 +22,7 @@ describe Issues::CloseService do
22 22
23 it 'should send email to user2 about assign of new issue' do 23 it 'should send email to user2 about assign of new issue' do
24 email = ActionMailer::Base.deliveries.last 24 email = ActionMailer::Base.deliveries.last
25 - email.to.first.should == user2.email 25 + email.cc.first.should == user2.email
26 email.subject.should include(issue.title) 26 email.subject.should include(issue.title)
27 end 27 end
28 28
spec/services/issues/update_service_spec.rb
@@ -31,7 +31,7 @@ describe Issues::UpdateService do @@ -31,7 +31,7 @@ describe Issues::UpdateService do
31 31
32 it 'should send email to user2 about assign of new issue' do 32 it 'should send email to user2 about assign of new issue' do
33 email = ActionMailer::Base.deliveries.last 33 email = ActionMailer::Base.deliveries.last
34 - email.to.first.should == user2.email 34 + email.cc.first.should == user2.email
35 email.subject.should include(issue.title) 35 email.subject.should include(issue.title)
36 end 36 end
37 37
spec/services/merge_requests/close_service_spec.rb
@@ -22,7 +22,7 @@ describe MergeRequests::CloseService do @@ -22,7 +22,7 @@ describe MergeRequests::CloseService do
22 22
23 it 'should send email to user2 about assign of new merge_request' do 23 it 'should send email to user2 about assign of new merge_request' do
24 email = ActionMailer::Base.deliveries.last 24 email = ActionMailer::Base.deliveries.last
25 - email.to.first.should == user2.email 25 + email.cc.first.should == user2.email
26 email.subject.should include(merge_request.title) 26 email.subject.should include(merge_request.title)
27 end 27 end
28 28
spec/services/merge_requests/update_service_spec.rb
@@ -31,7 +31,7 @@ describe MergeRequests::UpdateService do @@ -31,7 +31,7 @@ describe MergeRequests::UpdateService do
31 31
32 it 'should send email to user2 about assign of new merge_request' do 32 it 'should send email to user2 about assign of new merge_request' do
33 email = ActionMailer::Base.deliveries.last 33 email = ActionMailer::Base.deliveries.last
34 - email.to.first.should == user2.email 34 + email.cc.first.should == user2.email
35 email.subject.should include(merge_request.title) 35 email.subject.should include(merge_request.title)
36 end 36 end
37 37