From 1467a8fa33ee8d89c46881ae02302c9ef0bfe080 Mon Sep 17 00:00:00 2001 From: Tejaswini Chile Date: Fri, 28 Jan 2022 05:15:26 +0530 Subject: [PATCH] Fix: parse verification mail (#3864) Email parsing logic was stripping of HTML tables which was causing the issue in this case. Fixes: #3731 --- app/mailboxes/mailbox_helper.rb | 10 +++++++++- app/presenters/html_parser.rb | 1 - app/presenters/mail_presenter.rb | 16 ++++++++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/mailboxes/mailbox_helper.rb b/app/mailboxes/mailbox_helper.rb index 7cdfebe30..06fa8c0ee 100644 --- a/app/mailboxes/mailbox_helper.rb +++ b/app/mailboxes/mailbox_helper.rb @@ -5,7 +5,7 @@ module MailboxHelper @message = @conversation.messages.create( account_id: @conversation.account_id, sender: @conversation.contact, - content: processed_mail.text_content[:reply], + content: mail_content, inbox_id: @conversation.inbox_id, message_type: 'incoming', content_type: 'incoming_email', @@ -48,4 +48,12 @@ module MailboxHelper # notification emails are send via mailer sender email address. so it should match @processed_mail.original_sender == Mail::Address.new(ENV.fetch('MAILER_SENDER_EMAIL', 'Chatwoot ')).address end + + def mail_content + if processed_mail.text_content.present? + processed_mail.text_content[:reply] + elsif processed_mail.html_content.present? + processed_mail.html_content[:reply] + end + end end diff --git a/app/presenters/html_parser.rb b/app/presenters/html_parser.rb index 716e1a69a..0f243bb8e 100644 --- a/app/presenters/html_parser.rb +++ b/app/presenters/html_parser.rb @@ -15,7 +15,6 @@ class HtmlParser def filter_replies! document.xpath('//blockquote').each { |n| n.replace('> ') } - document.xpath('//table').each(&:remove) end def filtered_html diff --git a/app/presenters/mail_presenter.rb b/app/presenters/mail_presenter.rb index 542004595..d406b81be 100644 --- a/app/presenters/mail_presenter.rb +++ b/app/presenters/mail_presenter.rb @@ -27,15 +27,16 @@ class MailPresenter < SimpleDelegator end # returns encoded mail body text_part if available. + # returns encoded mail body as it is if mail_part not available. # else returns parsed the html body if contains text/html content. def select_body(mail_part) - return '' unless mail_part + return encoded_mail_body unless mail_part decoded = encode_to_unicode(mail_part.decoded) if mail.text_part decoded - elsif (mail.content_type || '').include? 'text/html' + elsif html_mail_body? ::HtmlParser.parse_reply(decoded) end end @@ -128,4 +129,15 @@ class MailPresenter < SimpleDelegator rescue StandardError '' end + + def html_mail_body? + ((mail.content_type || '').include? 'text/html') || @mail.html_part || @mail.html_part.content_type.include?('text/html') + end + + # returns mail body if mail content_type is text/plain + def encoded_mail_body + return encode_to_unicode(@mail.body.decoded) if (@mail.content_type || '').include? 'text/plain' + + '' + end end