我不明白您所说的“不同的供应商”是什么意思。电子邮件标题跟随a standard。因此,作为正则表达式,您只需要解析:
To: <contacts>
From: <contact>
Cc: <contacts>
更“复杂”的部分是<contact> 位。如需详细规格,请查看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)。
下一件大事是多部分消息。这也有点片状。
我的建议是使用现成的库来进行解析。我敢肯定,大多数流行语言都有一个可用的库,可以大大轻松完成这项任务。