forked from chatwoot/chatwoot
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feature: Conversation Continuity with Email (chatwoot#770)
* Added POC for mail inbox reply email * created mailbox and migratuion for the same * cleaned up sidekiq queues and added the queues for action mailbox and active storage * created conversation mailbox and functionlaity to create a message on the conversation when it's replied * Added UUID to conversation to be used in email replies * added migration to add uuid for conversation * changed parsing and resource fetching to reflect matching uuid and loading conversation alone * cleaned up conversation mailbox.rb * Added content type & attribute for message * Added the new reply email to outgoing emails * Added migration to accounts for adding domain and settings * Modified seeds to reflect this changes * Added the flag based column on account for boolean settings * Added the new reply to email in outgoing conversation emails based on conditions * Added dynamic email routing in application mailbox * Added dynamic email routing in application mailbox * Added a catch all deafult empty mailbox * Added annotation for account * Added the complete email details & attachments to the message * Added the complete email details to the message in content_attributes, like subject, to, cc, bcc etc * Modified the mail extractor to give a serilaized version of email * Handled storing attachments of email on the message * Added incoming email settings, env variables * [chatwoot#138] Added documentation regarding different email settings and variables * Fixed the mail attachments blob issue (chatwoot#138) * Decoided attachments were strings and had to construct blobs out fo them to work with active storage * Fixed the content encoding issue with mail body * Fixed issue with Proc used in apllication mailbox routing * Fixed couple of typos and silly mistakes * Set appropriate from email for conversation reply mails (chatwoot#138) * From email was taken from a env variable, changed it to take from account settings if enabled * Set the reply to email correctly based on conversation UUID * Added commented config ind development.rb for mailbox ingress * Added account settings for domain and support email (chatwoot#138) * Added the new attributes in accounts controller params whitelisting, api responses * Added options for the the new fields in account settings * Fixed typos in email continuity docs and warnings * Added specs for conversation reply mailer changes (chatwoot#138) * Added specs for * conversation reply mailer * Accounts controller * Account and Conversation models * Added tests for email presenter (chatwoot#138) * Specs for inbound email routing and mailboxes (chatwoot#138)
- Loading branch information
1 parent
0cb7333
commit 0b65526
Showing
34 changed files
with
1,858 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
class ApplicationMailbox < ActionMailbox::Base | ||
# Last part is the regex for the UUID | ||
# Eg: email should be something like : reply+to+6bdc3f4d-0bec-4515-a284-5d916fdde489@domain.com | ||
REPLY_EMAIL_USERNAME_PATTERN = /^reply\+to\+([0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12})$/i.freeze | ||
|
||
def self.reply_match_proc | ||
proc do |inbound_mail_obj| | ||
is_a_reply_email = false | ||
inbound_mail_obj.mail.to.each do |email| | ||
username = email.split('@')[0] | ||
match_result = username.match(REPLY_EMAIL_USERNAME_PATTERN) | ||
if match_result | ||
is_a_reply_email = true | ||
break | ||
end | ||
end | ||
is_a_reply_email | ||
end | ||
end | ||
|
||
def self.default_mail_proc | ||
proc { |_mail| true } | ||
end | ||
|
||
# routing should be defined below the referenced procs | ||
routing(reply_match_proc => :conversation) | ||
routing(default_mail_proc => :default) | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
class ConversationMailbox < ApplicationMailbox | ||
attr_accessor :conversation_uuid, :processed_mail | ||
|
||
# Last part is the regex for the UUID | ||
# Eg: email should be something like : reply+to+6bdc3f4d-0bec-4515-a284-5d916fdde489@domain.com | ||
EMAIL_PART_PATTERN = /^reply\+to\+([0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12})$/i.freeze | ||
|
||
before_processing :conversation_uuid_from_to_address, | ||
:verify_decoded_params, | ||
:find_conversation, | ||
:decorate_mail | ||
|
||
def process | ||
create_message | ||
add_attachments_to_message | ||
end | ||
|
||
private | ||
|
||
def create_message | ||
@message = @conversation.messages.create( | ||
account_id: @conversation.account_id, | ||
contact_id: @conversation.contact_id, | ||
content: processed_mail.content, | ||
inbox_id: @conversation.inbox_id, | ||
message_type: 'incoming', | ||
content_type: 'incoming_email', | ||
source_id: processed_mail.message_id, | ||
content_attributes: { | ||
email: processed_mail.serialized_data | ||
} | ||
) | ||
end | ||
|
||
def add_attachments_to_message | ||
processed_mail.attachments.each do |mail_attachment| | ||
attachment = @message.attachments.new( | ||
account_id: @conversation.account_id, | ||
file_type: 'file' | ||
) | ||
attachment.file.attach(mail_attachment[:blob]) | ||
end | ||
@message.save! | ||
end | ||
|
||
def conversation_uuid_from_to_address | ||
mail.to.each do |email| | ||
username = email.split('@')[0] | ||
match_result = username.match(ApplicationMailbox::REPLY_EMAIL_USERNAME_PATTERN) | ||
if match_result | ||
@conversation_uuid = match_result.captures | ||
break | ||
end | ||
end | ||
@conversation_uuid | ||
end | ||
|
||
def verify_decoded_params | ||
raise 'Conversation uuid not found' if conversation_uuid.nil? | ||
end | ||
|
||
def find_conversation | ||
@conversation = Conversation.find_by(uuid: conversation_uuid) | ||
validate_resource @conversation | ||
end | ||
|
||
def validate_resource(resource) | ||
raise "#{resource.class.name} not found" if resource.nil? | ||
|
||
resource | ||
end | ||
|
||
def decorate_mail | ||
@processed_mail = MailPresenter.new(mail) | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
class DefaultMailbox < ApplicationMailbox | ||
def process; end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.