From 4438cef46aa6ec6aa5e1136331da0ef73ce1575b Mon Sep 17 00:00:00 2001 From: Martin Edenhofer Date: Thu, 11 Feb 2016 00:09:27 +0100 Subject: [PATCH] Fixed #165, missing style on html emails with blockquote in outlook. --- app/models/channel/email_build.rb | 34 +++++++-- test/unit/email_build_test.rb | 112 +++++++++++++++++++----------- 2 files changed, 99 insertions(+), 47 deletions(-) diff --git a/app/models/channel/email_build.rb b/app/models/channel/email_build.rb index 21e37e555..376e1d26c 100644 --- a/app/models/channel/email_build.rb +++ b/app/models/channel/email_build.rb @@ -7,10 +7,10 @@ module Channel::EmailBuild =begin mail = Channel::EmailBuild.build( - :from => 'sender@example.com', - :to => 'recipient@example.com', - :body => 'somebody with some text', - :content_type => 'text/plain', + from: 'sender@example.com', + to: 'recipient@example.com', + body: 'somebody with some text', + content_type: 'text/plain', ) =end @@ -53,7 +53,7 @@ module Channel::EmailBuild content_type 'text/html; charset=UTF-8' # complete check - html_document = Channel::EmailBuild.html_complete_check( attr[:body] ) + html_document = Channel::EmailBuild.html_complete_check(attr[:body]) body html_document end @@ -110,11 +110,17 @@ module Channel::EmailBuild =begin - full_html_document_string = Channel::EmailBuild.html_complete_check( html_string ) +Check if string is a complete html document. If not, add head and css styles. + + full_html_document_string = Channel::EmailBuild.html_complete_check(html_string) =end def self.html_complete_check(html) + + # apply mail client fixes + html = Channel::EmailBuild.html_mail_client_fixes(html) + return html if html =~ //i css = "font-family:'Helvetica Neue', Helvetica, Arial, Geneva, sans-serif; font-size: 12px;" @@ -166,4 +172,20 @@ HERE html end + +=begin + +Add/change markup to display html in any mail client nice. + + html_string_with_fixes = Channel::EmailBuild.html_mail_client_fixes(html_string) + +=end + + def self.html_mail_client_fixes(html) + + # https://github.com/martini/zammad/issues/165 + html.gsub('
', '
') + + end + end diff --git a/test/unit/email_build_test.rb b/test/unit/email_build_test.rb index 04a4db2ec..1eecdbe9a 100644 --- a/test/unit/email_build_test.rb +++ b/test/unit/email_build_test.rb @@ -5,22 +5,22 @@ class EmailBuildTest < ActiveSupport::TestCase test 'document complete check' do html = 'test' - result = Channel::EmailBuild.html_complete_check( html ) + result = Channel::EmailBuild.html_complete_check(html) - assert( result =~ /^<\!DOCTYPE/, 'test 1') - assert( result !~ /^.+?<\!DOCTYPE/, 'test 1') - assert( result =~ //, 'test 1') - assert( result =~ /font-family/, 'test 1') - assert( result =~ %r{test}, 'test 1') + assert(result =~ /^<\!DOCTYPE/, 'test 1') + assert(result !~ /^.+?<\!DOCTYPE/, 'test 1') + assert(result =~ //, 'test 1') + assert(result =~ /font-family/, 'test 1') + assert(result =~ %r{test}, 'test 1') html = 'invalid test' - result = Channel::EmailBuild.html_complete_check( html ) + result = Channel::EmailBuild.html_complete_check(html) - assert( result !~ /^<\!DOCTYPE/, 'test 2') - assert( result =~ /^.+?<\!DOCTYPE/, 'test 2') - assert( result =~ //, 'test 2') - assert( result !~ /font-family/, 'test 2') - assert( result =~ %r{test}, 'test 2') + assert(result !~ /^<\!DOCTYPE/, 'test 2') + assert(result =~ /^.+?<\!DOCTYPE/, 'test 2') + assert(result =~ //, 'test 2') + assert(result !~ /font-family/, 'test 2') + assert(result =~ %r{test}, 'test 2') end @@ -52,33 +52,33 @@ class EmailBuildTest < ActiveSupport::TestCase > > Thank you for installing Zammad. äöüß >' - assert_equal( should, mail.text_part.body.to_s ) - assert_equal( html, mail.html_part.body.to_s ) + assert_equal(should, mail.text_part.body.to_s) + assert_equal(html, mail.html_part.body.to_s) parser = Channel::EmailParser.new - data = parser.parse( mail.to_s ) + data = parser.parse(mail.to_s) # check body - assert_equal( should, data[:body] ) + assert_equal(should, data[:body]) # check count of attachments, only 2, because 3 part is text message and is already in body - assert_equal( 2, data[:attachments].length ) + assert_equal(2, data[:attachments].length) # check attachments if data[:attachments] data[:attachments].each { |attachment| if attachment[:filename] == 'message.html' - assert_equal( nil, attachment[:preferences]['Content-ID'] ) - assert_equal( true, attachment[:preferences]['content-alternative'] ) - assert_equal( 'text/html', attachment[:preferences]['Mime-Type'] ) - assert_equal( 'UTF-8', attachment[:preferences]['Charset'] ) + assert_equal(nil, attachment[:preferences]['Content-ID']) + assert_equal(true, attachment[:preferences]['content-alternative']) + assert_equal('text/html', attachment[:preferences]['Mime-Type']) + assert_equal('UTF-8', attachment[:preferences]['Charset']) elsif attachment[:filename] == 'somename.png' - assert_equal( nil, attachment[:preferences]['Content-ID'] ) - assert_equal( nil, attachment[:preferences]['content-alternative'] ) - assert_equal( 'image/png', attachment[:preferences]['Mime-Type'] ) - assert_equal( 'UTF-8', attachment[:preferences]['Charset'] ) + assert_equal(nil, attachment[:preferences]['Content-ID']) + assert_equal(nil, attachment[:preferences]['content-alternative']) + assert_equal('image/png', attachment[:preferences]['Mime-Type']) + assert_equal('UTF-8', attachment[:preferences]['Charset']) else - assert( false, "invalid attachment, should not be there, #{attachment.inspect}" ) + assert(false, "invalid attachment, should not be there, #{attachment.inspect}") end } end @@ -106,28 +106,28 @@ class EmailBuildTest < ActiveSupport::TestCase > > Thank you for installing Zammad. äöüß >' - assert_equal( should, mail.text_part.body.to_s ) - assert_equal( nil, mail.html_part ) + assert_equal(should, mail.text_part.body.to_s) + assert_equal(nil, mail.html_part) parser = Channel::EmailParser.new - data = parser.parse( mail.to_s ) + data = parser.parse(mail.to_s) # check body - assert_equal( should, data[:body] ) + assert_equal(should, data[:body]) # check count of attachments, 2 - assert_equal( 1, data[:attachments].length ) + assert_equal(1, data[:attachments].length) # check attachments if data[:attachments] data[:attachments].each { |attachment| if attachment[:filename] == 'somename.png' - assert_equal( nil, attachment[:preferences]['Content-ID'] ) - assert_equal( nil, attachment[:preferences]['content-alternative'] ) - assert_equal( 'image/png', attachment[:preferences]['Mime-Type'] ) - assert_equal( 'UTF-8', attachment[:preferences]['Charset'] ) + assert_equal(nil, attachment[:preferences]['Content-ID']) + assert_equal(nil, attachment[:preferences]['content-alternative']) + assert_equal('image/png', attachment[:preferences]['Mime-Type']) + assert_equal('UTF-8', attachment[:preferences]['Charset']) else - assert( false, "invalid attachment, should not be there, #{attachment.inspect}" ) + assert(false, "invalid attachment, should not be there, #{attachment.inspect}") end } end @@ -148,17 +148,47 @@ class EmailBuildTest < ActiveSupport::TestCase > > Thank you for installing Zammad. äöüß >' - assert_equal( should, mail.body.to_s ) - assert_equal( nil, mail.html_part ) + assert_equal(should, mail.body.to_s) + assert_equal(nil, mail.html_part) parser = Channel::EmailParser.new - data = parser.parse( mail.to_s ) + data = parser.parse(mail.to_s) # check body - assert_equal( should, data[:body] ) + assert_equal(should, data[:body]) # check count of attachments, 0 - assert_equal( 0, data[:attachments].length ) + assert_equal(0, data[:attachments].length) + + end + + test 'email - html email client fixes' do + + # https://github.com/martini/zammad/issues/165 + html_raw = '
some +text +
+ +123 + +
some +text +
' + html_with_fixes = Channel::EmailBuild.html_mail_client_fixes(html_raw) + + assert_not_equal(html_with_fixes, html_raw) + + html_should = '
some +text +
+ +123 + +
some +text +
' + + assert_equal(html_should, html_with_fixes) end