fix: find mail message by references (#7220)
This commit is contained in:
@@ -35,9 +35,9 @@ class Imap::ImapMailbox
|
|||||||
end
|
end
|
||||||
|
|
||||||
def find_conversation_by_in_reply_to
|
def find_conversation_by_in_reply_to
|
||||||
return if in_reply_to.blank?
|
return if in_reply_to.blank? && @inbound_mail.references.blank?
|
||||||
|
|
||||||
message = @inbox.messages.find_by(source_id: in_reply_to)
|
message = @inbox.messages.find_by(source_id: in_reply_to) || find_message_by_references
|
||||||
if message.nil?
|
if message.nil?
|
||||||
@inbox.conversations.where("additional_attributes->>'in_reply_to' = ?", in_reply_to).first
|
@inbox.conversations.where("additional_attributes->>'in_reply_to' = ?", in_reply_to).first
|
||||||
else
|
else
|
||||||
@@ -49,6 +49,20 @@ class Imap::ImapMailbox
|
|||||||
@inbound_mail.in_reply_to
|
@inbound_mail.in_reply_to
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def find_message_by_references
|
||||||
|
message_to_return = nil
|
||||||
|
|
||||||
|
return if @inbound_mail.references.blank?
|
||||||
|
|
||||||
|
references = @inbound_mail.references
|
||||||
|
|
||||||
|
references.each do |message_id|
|
||||||
|
message = @inbox.messages.find_by(source_id: message_id)
|
||||||
|
message_to_return = message if message.present?
|
||||||
|
end
|
||||||
|
message_to_return
|
||||||
|
end
|
||||||
|
|
||||||
def find_or_create_conversation
|
def find_or_create_conversation
|
||||||
@conversation = find_conversation_by_in_reply_to || ::Conversation.create!({ account_id: @account.id,
|
@conversation = find_conversation_by_in_reply_to || ::Conversation.create!({ account_id: @account.id,
|
||||||
inbox_id: @inbox.id,
|
inbox_id: @inbox.id,
|
||||||
|
|||||||
16
spec/fixtures/files/references.eml
vendored
Normal file
16
spec/fixtures/files/references.eml
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
From: Sony Mathew <sony@chatwoot.com>
|
||||||
|
Mime-Version: 1.0 (Apple Message framework v1244.3)
|
||||||
|
Content-Type: multipart/alternative; boundary="Apple-Mail=_33A037C7-4BB3-4772-AE52-FCF2D7535F74"
|
||||||
|
Subject: Discussion: Let's debate these attachments
|
||||||
|
Date: Tue, 20 Apr 2020 04:20:20 -0400
|
||||||
|
In-Reply-To: <4e6e35f5a38b4_479f13bb90078178@small-app-01.mail>
|
||||||
|
References: <4e6e35f5a38b4_479f13bb90078178@small-app-01.mail> <test-reference-id>
|
||||||
|
Message-Id: <0CB459E0-0336-41DA-BC88-E6E28C697DDBF@chatwoot.com>
|
||||||
|
X-Mailer: Apple Mail (2.1244.3)
|
||||||
|
|
||||||
|
--Apple-Mail=_33A037C7-4BB3-4772-AE52-FCF2D7535F74
|
||||||
|
Content-Transfer-Encoding: quoted-printable
|
||||||
|
Content-Type: text/plain;
|
||||||
|
charset=utf-8
|
||||||
|
|
||||||
|
References Email
|
||||||
@@ -83,11 +83,34 @@ RSpec.describe Imap::ImapMailbox do
|
|||||||
let(:reply_mail) do
|
let(:reply_mail) do
|
||||||
create_inbound_email_from_mail(from: 'email@gmail.com', to: 'imap@gmail.com', subject: 'Hello!', in_reply_to: 'test-in-reply-to')
|
create_inbound_email_from_mail(from: 'email@gmail.com', to: 'imap@gmail.com', subject: 'Hello!', in_reply_to: 'test-in-reply-to')
|
||||||
end
|
end
|
||||||
|
let(:references_email) { create_inbound_email_from_fixture('references.eml') }
|
||||||
|
|
||||||
it 'creates new email conversation with incoming in-reply-to' do
|
it 'creates new email conversation with incoming in-reply-to' do
|
||||||
class_instance.process(reply_mail.mail, channel)
|
class_instance.process(reply_mail.mail, channel)
|
||||||
expect(conversation.additional_attributes['in_reply_to']).to eq(reply_mail.mail.in_reply_to)
|
expect(conversation.additional_attributes['in_reply_to']).to eq(reply_mail.mail.in_reply_to)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'append email to conversation with references id' do
|
||||||
|
inbox = Inbox.last
|
||||||
|
message = create(
|
||||||
|
:message,
|
||||||
|
content: 'Incoming Message',
|
||||||
|
message_type: 'incoming',
|
||||||
|
inbox: inbox,
|
||||||
|
source_id: 'test-reference-id',
|
||||||
|
account: account,
|
||||||
|
conversation: conversation
|
||||||
|
)
|
||||||
|
conversation = message.conversation
|
||||||
|
|
||||||
|
expect(conversation.messages.size).to eq(1)
|
||||||
|
|
||||||
|
class_instance.process(references_email.mail, inbox.channel)
|
||||||
|
|
||||||
|
expect(conversation.messages.size).to eq(2)
|
||||||
|
expect(conversation.messages.last.content).to eq('References Email')
|
||||||
|
expect(references_email.mail.references).to include('test-reference-id')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user