Fix #2364. Fall back to In-Reply-To header when reply key not available
This commit is contained in:
parent
63c8a05bf7
commit
31e76baf61
7 changed files with 87 additions and 4 deletions
|
@ -121,11 +121,17 @@ class Notify < BaseMailer
|
|||
#
|
||||
# See: mail_answer_thread
|
||||
def mail_new_thread(model, headers = {})
|
||||
headers['Message-ID'] = message_id(model)
|
||||
headers['Message-ID'] = message_reply_id
|
||||
headers['In-Reply-To'] = message_id(model)
|
||||
headers['References'] = message_id(model)
|
||||
|
||||
mail_thread(model, headers)
|
||||
end
|
||||
|
||||
def message_reply_id
|
||||
Gitlab.config.incoming_email["address"].gsub("%{key}", reply_key)
|
||||
end
|
||||
|
||||
# Send an email that responds to an existing conversation thread,
|
||||
# with headers suitable for grouping by thread in email clients.
|
||||
#
|
||||
|
|
|
@ -63,6 +63,10 @@ module Gitlab
|
|||
end
|
||||
|
||||
def reply_key
|
||||
key_from_to_address || key_from_in_reply_to_header
|
||||
end
|
||||
|
||||
def key_from_to_address
|
||||
key = nil
|
||||
message.to.each do |address|
|
||||
key = Gitlab::IncomingEmail.key_from_address(address)
|
||||
|
@ -72,6 +76,17 @@ module Gitlab
|
|||
key
|
||||
end
|
||||
|
||||
def key_from_in_reply_to_header
|
||||
reply_key = nil
|
||||
|
||||
message[:in_reply_to].message_ids.each do |message_id|
|
||||
reply_key = Gitlab::IncomingEmail.key_from_address(message_id)
|
||||
break if reply_key
|
||||
end
|
||||
|
||||
reply_key
|
||||
end
|
||||
|
||||
def sent_notification
|
||||
return nil unless reply_key
|
||||
|
||||
|
|
42
spec/fixtures/emails/key_in_headers_reply.eml
vendored
Normal file
42
spec/fixtures/emails/key_in_headers_reply.eml
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
Return-Path: <jake@adventuretime.ooo>
|
||||
Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <reply@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
In-Reply-To: <reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo>
|
||||
References: <issue_1@localhost> <reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo>
|
||||
Date: Thu, 13 Jun 2013 17:03:48 -0400
|
||||
From: Jake the Dog <jake@adventuretime.ooo>
|
||||
To: reply@appmail.adventuretime.ooo
|
||||
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
|
||||
Subject: re: [Discourse Meta] eviltrout posted in 'Adventure Time Sux'
|
||||
Mime-Version: 1.0
|
||||
Content-Type: text/plain;
|
||||
charset=ISO-8859-1
|
||||
Content-Transfer-Encoding: 7bit
|
||||
X-Sieve: CMU Sieve 2.2
|
||||
X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
|
||||
13 Jun 2013 14:03:48 -0700 (PDT)
|
||||
X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
|
||||
|
||||
I could not disagree more. I am obviously biased but adventure time is the
|
||||
greatest show ever created. Everyone should watch it.
|
||||
|
||||
- Jake out
|
||||
|
||||
|
||||
On Sun, Jun 9, 2013 at 1:39 PM, eviltrout via Discourse Meta
|
||||
<reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo> wrote:
|
||||
>
|
||||
>
|
||||
>
|
||||
> eviltrout posted in 'Adventure Time Sux' on Discourse Meta:
|
||||
>
|
||||
> ---
|
||||
> hey guys everyone knows adventure time sucks!
|
||||
>
|
||||
> ---
|
||||
> Please visit this link to respond: http://localhost:3000/t/adventure-time-sux/1234/3
|
||||
>
|
||||
> To unsubscribe from these emails, visit your [user preferences](http://localhost:3000/user_preferences).
|
||||
>
|
4
spec/fixtures/emails/valid_reply.eml
vendored
4
spec/fixtures/emails/valid_reply.eml
vendored
|
@ -3,6 +3,8 @@ Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.
|
|||
Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
|
||||
Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
|
||||
In-Reply-To: <reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo>
|
||||
References: <issue_1@localhost> <reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo>
|
||||
Date: Thu, 13 Jun 2013 17:03:48 -0400
|
||||
From: Jake the Dog <jake@adventuretime.ooo>
|
||||
To: reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo
|
||||
|
@ -37,4 +39,4 @@ On Sun, Jun 9, 2013 at 1:39 PM, eviltrout via Discourse Meta
|
|||
> Please visit this link to respond: http://localhost:3000/t/adventure-time-sux/1234/3
|
||||
>
|
||||
> To unsubscribe from these emails, visit your [user preferences](http://localhost:3000/user_preferences).
|
||||
>
|
||||
>
|
||||
|
|
|
@ -137,5 +137,18 @@ describe Gitlab::Email::Receiver, lib: true do
|
|||
|
||||
expect(note.note).to include(markdown)
|
||||
end
|
||||
|
||||
context "when the reply key is in the In-Reply-To header" do
|
||||
let(:email_raw) { fixture_file("emails/key_in_headers_reply.eml") }
|
||||
|
||||
it "creates a comment" do
|
||||
expect { receiver.execute }.to change { noteable.notes.count }.by(1)
|
||||
note = noteable.notes.last
|
||||
|
||||
expect(note.author).to eq(sent_notification.recipient)
|
||||
expect(note.note).to include("I could not disagree more.")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -217,7 +217,11 @@ describe Notify do
|
|||
end
|
||||
|
||||
it 'has the correct message-id set' do
|
||||
is_expected.to have_header 'Message-ID', "<merge_request_#{merge_request.id}@#{Gitlab.config.gitlab.host}>"
|
||||
is_expected.to have_header 'Message-ID', /<reply\+(.*)@#{Gitlab.config.gitlab.host}>/
|
||||
end
|
||||
|
||||
it 'has the correct references set' do
|
||||
is_expected.to have_header 'References', "<merge_request_#{merge_request.id}@#{Gitlab.config.gitlab.host}>"
|
||||
end
|
||||
|
||||
context 'when enabled email_author_in_body' do
|
||||
|
|
|
@ -50,7 +50,8 @@ shared_examples 'an email starting a new thread' do |message_id_prefix|
|
|||
include_examples 'an email with X-GitLab headers containing project details'
|
||||
|
||||
it 'has a discussion identifier' do
|
||||
is_expected.to have_header 'Message-ID', /<#{message_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
|
||||
is_expected.to have_header 'Message-ID', /<reply\+(.*)@#{Gitlab.config.gitlab.host}>/
|
||||
is_expected.to have_header 'References', /<#{message_id_prefix}(.*)@#{Gitlab.config.gitlab.host}>/
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue