0b65526b85
* 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 * [#138] Added documentation regarding different email settings and variables * Fixed the mail attachments blob issue (#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 (#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 (#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 (#138) * Added specs for * conversation reply mailer * Accounts controller * Account and Conversation models * Added tests for email presenter (#138) * Specs for inbound email routing and mailboxes (#138)
76 lines
2.1 KiB
Ruby
76 lines
2.1 KiB
Ruby
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
|