使用 Javascript 解析电子邮件源的文本/html 部分

Posted

技术标签:

【中文标题】使用 Javascript 解析电子邮件源的文本/html 部分【英文标题】:Parse text/html part of email source using Javascript 【发布时间】:2012-07-04 08:11:12 【问题描述】:

使用 javascript,我需要解析电子邮件的 Content-Type text/html 部分并仅提取 HTML 部分。以下是相关邮件源部分的示例:

------=_Part_1504541_510475628.1327512846983
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit


<html ... a bunch of html ...

/html>

我想在text/html 之后提取&lt;html&gt; 标签之间(包括)之间的所有内容。我该怎么做?

注意:我可以使用 hacky 正则表达式。我不认为这是防弹的。

【问题讨论】:

【参考方案1】:

根据 RFC/MIME 文档,封装边界被定义为一行完全由两个连字符(“-”,十进制代码 45)组成的行,后跟来自 Content-Type 标头字段的边界参数值。

注意:在 JavaScript 中确实没有 /s 修饰符来使点 . 匹配所有字符,包括换行符。要绝对匹配任何字符,您可以使用包含速记类及其否定版本的字符类,例如 [\s\S]


正则表达式:

\n--[^\n\r]*\r?\nContent-Type: text\/html[\s\S]*?\r?\n\r?\n([\s\S]*?)\n\r?\n--

JavaScript:

matches = /\n--[^\n\r]*\r?\nContent-Type: text\/html[\s\S]*?\r?\n\r?\n([\s\S]*?)\n\r?\n--/gim.exec(mail);

【讨论】:

【参考方案2】:

Ωmega 的答案很接近,但您不能确定边界是否包含- 字符。

您首先需要查看标题。实际电子邮件内容的标题和正文将由\r\n\r\n 分隔。您应该会看到类似

的标题
Content-Type: multipart/alternative;
    boundary="------=_Part_1504541_510475628.1327512846983"

然后您可以使用此边界来找到实际的分隔线。然后,您可以像 Ωmega 一样构造一个正则表达式,但在此分隔符中进行替换。

唯一需要注意的是,除了正常的边界内容之外,最后一个边界的末尾还会有--

【讨论】:

史蒂夫,我已经用文档中的注释编辑了我的答案 - 边界必须以至少两个 - 字符开头...【参考方案3】:
var html = source.toString().substr(source.toString().indexOf("\n\n")).trim();

【讨论】:

以上是关于使用 Javascript 解析电子邮件源的文本/html 部分的主要内容,如果未能解决你的问题,请参考以下文章

当我使用 codeigniter 电子邮件类发送电子邮件时显示 html 源的电子邮件

JavaScript 从批量文本中提取电子邮件(使用正则表达式,JavaScript和jQuery)

Linux Shell编程实战---解析文本中的邮件地址和url

Gmail API - 使用 Javascript 解析邮件内容(Base64 解码?)

使用 JavaScript 进行文本解析和格式化

从批量文本中提取电子邮件(使用正则表达式JavaScript和jQuery)