【问题标题】:Parsing email conversations with regular expressions使用正则表达式解析电子邮件对话
【发布时间】:2009-11-04 07:14:24
【问题描述】:

我正在编写一个需要从电子邮件对话中提取元数据的 BI 应用程序。 即给定一个电子邮件线程,我希望提取所有参与者和对话结构。例如,给定这样的对话:

From: me
To: You
CC: someone

<Body>

From: You
To: Someone
CC: Someone else

<Body>

我想提取发送给“某人”的“你”并通过抄送发送给“某人”,所有这些都从“我”转发给“你”,抄送给“某人”...

我的问题是我需要处理不同的提供者。

是否有人熟悉网络上某处涵盖此类需求的一组正则表达式?

谢谢!

【问题讨论】:

  • 最好使用真正的解析器而不是一些正则表达式结构。

标签: regex email


【解决方案1】:

我不明白您所说的“不同的供应商”是什么意思。电子邮件标题跟随a standard。因此,作为正则表达式,您只需要解析:

To: <contacts>
From: <contact>
Cc: <contacts>

更“复杂”的部分是&lt;contact&gt; 位。如需详细规格,请查看section 3.4 of the mentioned standard

还有有用的regex examples for email-addresses 可用。所以,举个最基本的例子,它可能看起来像这样(假设都是大写的):

\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

现在,添加 To: 字符串:

\bTo: [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

从技术上讲,标题(如To: )总是从行首开始,所以你可以这样做:

^To: [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b

如果需要提取邮箱地址,需要添加捕获组:

^To: ([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})\b

这只会捕获一个地址,因此您可能希望从这里扩展:

^To: ([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})(,\s*[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4})*\b

这是匹配多个地址的一种非常幼稚的方式。您最终将在一个捕获组中拥有第一个地址,而在第二组中拥有所有其余地址。更好的方法是与之匹配。如果匹配,删除前导的To: ,用逗号分割并修剪其余部分。

如您所见,您在这里打开了一小罐蠕虫。解析电子邮件并不像看起来那么简单。解析标头很简单(基于上述示例)。然而,消息体是另一种野兽。几乎每个电子邮件客户端(Thunderbird、Outlook (express)、mutt、...)处理这个略有不同。有时新版本的行为与旧版本不同。这在很大程度上取决于客户端设置、系统区域设置等。用户是否发送 UTF8、引用的可打印、CP1252、...?引用标准:

注意:本规范并非旨在规定网站使用的内部格式, 他们期望支持的特定消息系统功能,或任何 创建或读取消息的用户界面程序的特征。此外, 本文档未指定传输或传输字符的编码 贮存;也就是说,它没有指定使用的位数或这些位数如何 专门通过网络传输或存储在磁盘上。

您可能很幸运,因为发送电子邮件客户端添加了一个标头,指定了编码,但他们并没有强制这样做(AFAICS)。

下一件大事是多部分消息。这也有点片状。

我的建议是使用现成的库来进行解析。我敢肯定,大多数流行语言都有一个可用的库,可以大大轻松完成这项任务。

【讨论】:

  • OP 指的是消息正文中的文本,其中包含引用的先前消息的线程。他的问题比他意识到的还要糟糕,因为一旦有人使用外语电子邮件客户端,文本中就会出现各种奇怪的标签。
  • 啊。对......是的......这真的会让它......痛苦......:(也许正如迈克尔所说......不可能。嗯......不可行,因为在软件开发中没有“不可能”。
【解决方案2】:

如果您希望自己实现它,请从这里开始:http://www.ietf.org/rfc/rfc2822.txt

【讨论】:

  • +1。特别是,您可能需要检查 Message-Id:References:In-Reply-To: 标头字段,或 Subject: 字段(如果它以 ReFw 或这些字符串的任何本地化形式开头)。
【解决方案3】:

你在问不可能的事。在这种情况下,您需要使用真正的解析器,而不仅仅是使用正则表达式构建一些东西。

您可以在Parse email content from quoted reply 此处查看答案,其中有人试图使用正则表达式和 cmets 执行类似的操作,以了解它有多么棘手。请阅读the paper on assembling email threads

如果您想要一些测试数据来尝试这个,您可以下载Enron dataset,其中包含安然员工在崩溃之前发送/接收的半百万封电子邮件(400meg 压缩)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多