- From: Neil Jenkins <neilj@fastmail.fm>
- Date: Tue, 04 Feb 2014 12:40:19 +1100
- To: HTML for Email Community Group <public-htmail@w3.org>
Hi,
I'm Neil Jenkins and I work for FastMail (https://www.fastmail.fm),
mainly building our webmail client. I'm happy to offer our perspective
as an email client author and service provider.
As a quick guide, we do the following with HTML email:
* Try to support the full fidelity of the browser, subject to the
constraints below.
* Parse the whole structure on the server, with all tags, attributes
etc. evaluated against a white-list to remove any potential security
issues (no JavaScript allowed, no plugins, no frames).
* Any external content (images, linked CSS etc.) is allowed only via
user preference, to prevent unwanted tracking.
* CSS properties like position:fixed that could draw over the main UI
are not allowed.
* CSS selector precedence is not respected – precedence is solely
determined by order. Due to the need to render the email in the same
HTML page as the webmail UI without the two conflicting and without
rendering the email in an iframe, we do the following:
1. Have a hidden iframe in which we inject the CSS.
2. Build a DOM tree from the HTML using innerHTML in the scope of the
original page, but don't insert it into the document yet.
3. Use the Stylesheets API to traverse the parsed CSS in the iframe,
then use querySelectorAll to find the elements in the DOM tree that
a rule applies to and apply the style directly to the elements. We
iterate backwards through the rules and don't override a style
already set, which maintains the basic precedence (direct attribute
> CSS rule, later rules > earlier rules), but doesn't match the
real CSS precedence. We also support most media queries.
4. Strip the ids and class names from the elements to avoid any
conflicts with the CSS for the UI.
5. Inject it into the page for the browser to render.
I don't know how this compares to other webmail clients, but all are
faced with the same problem: cleaning potentially dangerous external
content which you need to inject into a page with full privileges. So,
perhaps some standardised "safe" subset of HTML/CSS could be agreed
upon, preferably as easy to verify as possible.
Cheers,
Neil.
Received on Tuesday, 4 February 2014 12:53:22 UTC