处理 IMAP HTML 电子邮件时,如何在线隔离 CSS?

When processing IMAP HTML emails, how can I quarantine in-line CSS?

我正在构建一个 IMAP 网络邮件客户端。问题是 HTML 电子邮件可能包含 CSS,这会影响客户端的布局/样式。

应用程序前端基于 AngularJS 构建。

一种可能的解决方案是使用框架/iframe。这些的问题是您必须提供 src 属性。此内容作为 json 数据到达浏览器。我可能会将后端设置为为每封电子邮件提供 URL,但这意味着对服务器的请求更多。

查看 gmail DOM(例如)我没有看到任何框架的使用,所以我推断一定有替代技术。

我参与了一个小型项目,该项目试图实现您在此处描述的内容,但出于不同的原因。辛苦了,最后放弃了,直接用iframe解决了。

我们尝试的路由与 SpamAssassin 类似:

  1. 我们通过提取 <body>innerHTML 来删除整个 <head>
  2. 我们使用 DOM 解析器删除了所有嵌入的样式标签。
  3. 我们对匹配 <...float:left...> 的任何内容进行了正则表达式(恐怖!),并通过将其替换为 floatXXX:left 对其进行了修改。我们为每个 CSS 属性 我们想要 'quarantine'.

问题很简单,虽然我们能够 'quarantine' CSS,但大部分电子邮件都无法使用。仅格式化 CSS(例如 font-weight)陷入了交火,要替换的永无止境的正则表达式模式列表使其速度非常慢。

我们试图通过在页面顶部使用 !important 规则放置大量默认值来简化这一点,然后修改任何内联 !important 规则。这就是雅虎采用的方法。这提高了性能,但我们继续使太多电子邮件无法读取。

我相信 Google 的方法对于反向 polyfill 来说是必不可少的 - 它们取代了浏览器的方式,比如说,用自己的方式处理浮点数。然而,这超出了我们的能力,我们甚至没有尝试。

最后,iframe 解决方案的实施速度非常快,而且可能很快就能满足用户的需求。您现在可以随时推出,并在以后更新到更复杂的解决方案。他们还有一个额外的优势,那就是他们得到了相当全面的 CSS 支持。我唯一要在 iframed 内容中禁用的是 JavaScript,它会以 CSS 无法做到的方式对父级造成严重破坏,而且会非常不安全。