Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorPierre de La Morinerie <pierre@capitainetrain.com>2014-02-24 15:12:29 +0400
committerPierre de La Morinerie <pierre@capitainetrain.com>2014-06-10 19:09:15 +0400
commitde90b572d8f22708ea76ffbea9c513143fdeea2e (patch)
treea2613e9f30ec0e5516d489b02652c64459d11323 /app
parent466b768bb34730ee6a24d950333c232009c34bbd (diff)
Allow more mail clients to group emails by thread
* send a ‘In-Reply-To’ header along the ‘References’ header * subject of answers to an existing thread begins with ‘Re: ’ This fixes threading with at least Mail.app and Airmail.
Diffstat (limited to 'app')
-rw-r--r--app/mailers/emails/issues.rb32
-rw-r--r--app/mailers/emails/merge_requests.rb32
-rw-r--r--app/mailers/emails/notes.rb23
-rw-r--r--app/mailers/notify.rb52
4 files changed, 88 insertions, 51 deletions
diff --git a/app/mailers/emails/issues.rb b/app/mailers/emails/issues.rb
index 50676ac10cb..516e3da84c8 100644
--- a/app/mailers/emails/issues.rb
+++ b/app/mailers/emails/issues.rb
@@ -4,10 +4,10 @@ module Emails
@issue = Issue.find(issue_id)
@project = @issue.project
@target_url = project_issue_url(@project, @issue)
- set_message_id("issue_#{issue_id}")
- mail(from: sender(@issue.author_id),
- cc: recipient(recipient_id),
- subject: subject("#{@issue.title} (##{@issue.iid})"))
+ mail_new_thread(@issue,
+ from: sender(@issue.author_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@issue.title} (##{@issue.iid})"))
end
def reassigned_issue_email(recipient_id, issue_id, previous_assignee_id, updated_by_user_id)
@@ -15,10 +15,10 @@ module Emails
@previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id
@project = @issue.project
@target_url = project_issue_url(@project, @issue)
- set_reference("issue_#{issue_id}")
- mail(from: sender(updated_by_user_id),
- cc: recipient(recipient_id),
- subject: subject("#{@issue.title} (##{@issue.iid})"))
+ mail_answer_thread(@issue,
+ from: sender(updated_by_user_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@issue.title} (##{@issue.iid})"))
end
def closed_issue_email(recipient_id, issue_id, updated_by_user_id)
@@ -26,10 +26,10 @@ module Emails
@project = @issue.project
@updated_by = User.find updated_by_user_id
@target_url = project_issue_url(@project, @issue)
- set_reference("issue_#{issue_id}")
- mail(from: sender(updated_by_user_id),
- cc: recipient(recipient_id),
- subject: subject("#{@issue.title} (##{@issue.iid})"))
+ mail_answer_thread(@issue,
+ from: sender(updated_by_user_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@issue.title} (##{@issue.iid})"))
end
def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id)
@@ -38,10 +38,10 @@ module Emails
@project = @issue.project
@updated_by = User.find updated_by_user_id
@target_url = project_issue_url(@project, @issue)
- set_reference("issue_#{issue_id}")
- mail(from: sender(updated_by_user_id),
- cc: recipient(recipient_id),
- subject: subject("#{@issue.title} (##{@issue.iid})"))
+ mail_answer_thread(@issue,
+ from: sender(updated_by_user_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@issue.title} (##{@issue.iid})"))
end
end
end
diff --git a/app/mailers/emails/merge_requests.rb b/app/mailers/emails/merge_requests.rb
index 6b46cc90e08..c4ca3a3b69b 100644
--- a/app/mailers/emails/merge_requests.rb
+++ b/app/mailers/emails/merge_requests.rb
@@ -4,10 +4,10 @@ module Emails
@merge_request = MergeRequest.find(merge_request_id)
@project = @merge_request.project
@target_url = project_merge_request_url(@project, @merge_request)
- set_message_id("merge_request_#{merge_request_id}")
- mail(from: sender(@merge_request.author_id),
- cc: recipient(recipient_id),
- subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
+ mail_new_thread(@merge_request,
+ from: sender(@merge_request.author_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
end
def reassigned_merge_request_email(recipient_id, merge_request_id, previous_assignee_id, updated_by_user_id)
@@ -15,10 +15,10 @@ module Emails
@previous_assignee = User.find_by(id: previous_assignee_id) if previous_assignee_id
@project = @merge_request.project
@target_url = project_merge_request_url(@project, @merge_request)
- set_reference("merge_request_#{merge_request_id}")
- mail(from: sender(updated_by_user_id),
- cc: recipient(recipient_id),
- subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
+ mail_answer_thread(@merge_request,
+ from: sender(updated_by_user_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
end
def closed_merge_request_email(recipient_id, merge_request_id, updated_by_user_id)
@@ -26,20 +26,20 @@ module Emails
@updated_by = User.find updated_by_user_id
@project = @merge_request.project
@target_url = project_merge_request_url(@project, @merge_request)
- set_reference("merge_request_#{merge_request_id}")
- mail(from: sender(updated_by_user_id),
- cc: recipient(recipient_id),
- subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
+ mail_answer_thread(@merge_request,
+ from: sender(updated_by_user_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
end
def merged_merge_request_email(recipient_id, merge_request_id, updated_by_user_id)
@merge_request = MergeRequest.find(merge_request_id)
@project = @merge_request.project
@target_url = project_merge_request_url(@project, @merge_request)
- set_reference("merge_request_#{merge_request_id}")
- mail(from: sender(updated_by_user_id),
- cc: recipient(recipient_id),
- subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
+ mail_answer_thread(@merge_request,
+ from: sender(updated_by_user_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
end
end
diff --git a/app/mailers/emails/notes.rb b/app/mailers/emails/notes.rb
index d6ab63fe68c..7848d34ab2b 100644
--- a/app/mailers/emails/notes.rb
+++ b/app/mailers/emails/notes.rb
@@ -5,9 +5,10 @@ module Emails
@commit = @note.noteable
@project = @note.project
@target_url = project_commit_url(@project, @commit, anchor: "note_#{@note.id}")
- mail(from: sender(@note.author_id),
- cc: recipient(recipient_id),
- subject: subject("#{@commit.title} (#{@commit.short_id})"))
+ mail_answer_thread(@commit,
+ from: sender(@note.author_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@commit.title} (#{@commit.short_id})"))
end
def note_issue_email(recipient_id, note_id)
@@ -15,10 +16,10 @@ module Emails
@issue = @note.noteable
@project = @note.project
@target_url = project_issue_url(@project, @issue, anchor: "note_#{@note.id}")
- set_reference("issue_#{@issue.id}")
- mail(from: sender(@note.author_id),
- cc: recipient(recipient_id),
- subject: subject("#{@issue.title} (##{@issue.iid})"))
+ mail_answer_thread(@issue,
+ from: sender(@note.author_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@issue.title} (##{@issue.iid})"))
end
def note_merge_request_email(recipient_id, note_id)
@@ -26,10 +27,10 @@ module Emails
@merge_request = @note.noteable
@project = @note.project
@target_url = project_merge_request_url(@project, @merge_request, anchor: "note_#{@note.id}")
- set_reference("merge_request_#{@merge_request.id}")
- mail(from: sender(@note.author_id),
- cc: recipient(recipient_id),
- subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
+ mail_answer_thread(@merge_request,
+ from: sender(@note.author_id),
+ cc: recipient(recipient_id),
+ subject: subject("#{@merge_request.title} (##{@merge_request.iid})"))
end
def note_wall_email(recipient_id, note_id)
diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb
index 8eea8cf25e0..d65bead9cfe 100644
--- a/app/mailers/notify.rb
+++ b/app/mailers/notify.rb
@@ -67,14 +67,6 @@ class Notify < ActionMailer::Base
end
end
- # Set the Message-ID header field
- #
- # local_part - The local part of the message ID
- #
- def set_message_id(local_part)
- headers["Message-ID"] = "<#{local_part}@#{Gitlab.config.gitlab.host}>"
- end
-
# Set the References header field
#
# local_part - The local part of the referenced message ID
@@ -107,4 +99,48 @@ class Notify < ActionMailer::Base
subject << extra.join(' | ') if extra.present?
subject
end
+
+ # Return a string suitable for inclusion in the 'Message-Id' mail header.
+ #
+ # The message-id is generated from the unique URL to a model object.
+ def message_id(model)
+ model_name = model.class.model_name.singular_route_key
+ "<#{model_name}_#{model.id}@#{Gitlab.config.gitlab.host}>"
+ end
+
+ # Send an email that starts a new conversation thread,
+ # with headers suitable for grouping by thread in email clients.
+ #
+ # See: mail_answer_thread
+ def mail_new_thread(model, headers = {}, &block)
+ raise ArgumentError, '"To:" header will be overwritten; use "Cc:" or "Bcc:"' unless headers[:to].nil?
+ headers[:to] = project_sender_address.format
+
+ headers['Message-ID'] = message_id(model)
+
+ mail(headers, &block)
+ end
+
+ # Send an email that responds to an existing conversation thread,
+ # with headers suitable for grouping by thread in email clients.
+ #
+ # For grouping emails by thread, email clients heuristics require the answers to:
+ #
+ # * have a subject that begin by 'Re: '
+ # * have a 'In-Reply-To' or 'References' header that references the original 'Message-ID'
+ # * have stable 'From' and 'To' headers between messages of the same thread
+ #
+ def mail_answer_thread(model, headers = {}, &block)
+ raise ArgumentError, '"To:" header will be overwritten; use "Cc:" or "Bcc:"' unless headers[:to].nil?
+ headers[:to] = project_sender_address.format
+
+ headers['In-Reply-To'] = message_id(model)
+ headers['References'] = message_id(model)
+
+ if (headers[:subject])
+ headers[:subject].prepend('Re: ')
+ end
+
+ mail(headers, &block)
+ end
end