diff --git a/app/presenters/mail_presenter.rb b/app/presenters/mail_presenter.rb index cc062b1c9..542004595 100644 --- a/app/presenters/mail_presenter.rb +++ b/app/presenters/mail_presenter.rb @@ -8,30 +8,49 @@ class MailPresenter < SimpleDelegator end def subject - encode_to_unicode(@mail.subject || '') + encode_to_unicode(@mail.subject) end def text_content - @decoded_text_content ||= encode_to_unicode(text_part&.decoded || decoded_message || '') + @decoded_text_content = select_body(text_part) || '' + encoding = @decoded_text_content.encoding + + body = EmailReplyTrimmer.trim(@decoded_text_content) return {} if @decoded_text_content.blank? @text_content ||= { - full: @decoded_text_content, - reply: extract_reply(@decoded_text_content)[:reply], - quoted: extract_reply(@decoded_text_content)[:quoted_text] + full: select_body(text_part), + reply: @decoded_text_content, + quoted: body.force_encoding(encoding).encode('UTF-8') } end + # returns encoded mail body text_part if available. + # else returns parsed the html body if contains text/html content. + def select_body(mail_part) + return '' unless mail_part + + decoded = encode_to_unicode(mail_part.decoded) + + if mail.text_part + decoded + elsif (mail.content_type || '').include? 'text/html' + ::HtmlParser.parse_reply(decoded) + end + end + def html_content - @decoded_html_content ||= encode_to_unicode(html_part&.decoded) + @decoded_html_content = select_body(html_part) || '' return {} if @decoded_html_content.blank? + body = EmailReplyTrimmer.trim(@decoded_html_content) + @html_content ||= { - full: @decoded_html_content, - reply: extract_reply(@decoded_html_content)[:reply], - quoted: extract_reply(@decoded_html_content)[:quoted_text] + full: select_body(html_part), + reply: @decoded_html_content, + quoted: body } end @@ -47,14 +66,6 @@ class MailPresenter < SimpleDelegator end end - def decoded_message - if mail.multipart? - return mail.text_part ? mail.text_part.decoded : nil - end - - mail.decoded - end - def number_of_attachments mail.attachments.count end @@ -114,13 +125,7 @@ class MailPresenter < SimpleDelegator return str if current_encoding == 'UTF-8' str.encode(current_encoding, 'UTF-8', invalid: :replace, undef: :replace, replace: '?') - end - - def extract_reply(content) - # NOTE: implement the reply parser over here - { - reply: content.strip, - quoted_text: content.strip - } + rescue StandardError + '' end end diff --git a/spec/fixtures/files/mail_with_quote.eml b/spec/fixtures/files/mail_with_quote.eml index 2019dd692..4e7266fcb 100644 --- a/spec/fixtures/files/mail_with_quote.eml +++ b/spec/fixtures/files/mail_with_quote.eml @@ -30,14 +30,14 @@ Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Yes, I am providing you step how to reproduce this issue
On= +div>
class=3D"gmail_quote">
On= Thu, Aug 19, 2021 at 2:07 PM Tejaswini from Email sender test &l= t;tejaswini@chatwoot.com> wrot= e:

-

Any update on this?

+

Any update on this?

-

+



--
Sony Mathew.
wrote: + + > Any update on this? + > + > + + -- + * Sony Mathew* + Software developer + *Mob:9999999999 + BODY + ) + end + + it 'add the mail content as new message on the conversation with broken html' do + described_subject + current_message = conversation.messages.last + expect(current_message.reload.content_attributes[:email][:text_content][:reply]).to eq( + <<-BODY.strip_heredoc.chomp + Yes, I am providing you step how to reproduce this issue + + On Thu, Aug 19, 2021 at 2:07 PM Tejaswini from Email sender test < tejaswini@chatwoot.com> wrote: + + > Any update on this? + > + > + + -- + * Sony Mathew* + Software developer + *Mob:9999999999 + BODY + ) + end + end end end