FIX: Make Email::Styles operate on html documents instead of fragments

`Nokogiri::HTML.fragment` is a huge hack (a comment in the source code
admits this). The current behavior of `Email::Styles` is to try to
emulate `fragment` using nokogumbo, but it misses some edge cases. In
particular, meta tags in a email template don't make it through to the
final email.

Instead of treating the provided HTML as an indeterminate fragment, this
commit makes `Email::Styles` treat the HTML as a complete document. This
means that the generated HTML for an email will now always contain top
level structure (a doctype, html, head and body tags).

This new behavior is behind a hidden site setting for now and defaults
off.
This commit is contained in:
Daniel Waterworth 2020-07-06 11:45:39 +01:00
parent cb1b472a0f
commit 1bd8a075d8
2 changed files with 9 additions and 1 deletions

View File

@ -1104,6 +1104,9 @@ email:
client: true
default: true
hidden: true
preserve_email_structure_when_styling:
default: false
hidden: true
files:
max_image_size_kb:

View File

@ -242,8 +242,13 @@ module Email
strip_classes_and_ids
replace_relative_urls
replace_secure_media_urls
if SiteSetting.preserve_email_structure_when_styling
@fragment.to_html
else
include_body? ? @fragment.at("body").to_html : @fragment.at("body").children.to_html
end
end
def include_body?
@html =~ /<body>/i