在 C# 中使用正则表达式解析电子邮件

Posted

技术标签:

【中文标题】在 C# 中使用正则表达式解析电子邮件【英文标题】:parse email with regex in c# 【发布时间】:2011-08-28 17:00:49 【问题描述】:

我需要在 c# 中使用正则表达式解析电子邮件文件,即解析包含多封电子邮件的电子邮件文件并将其解析为其组成部分,例如 from、to、bcc 等。

用于电子邮件的正则表达式是

"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"

我遇到的问题是收件人、抄送和密件抄送有时包含不止一封电子邮件,并且出现在不止一行中

To: Me meagain <me@me.com>,
    Me1 meagain <me1@me.com>,Me3 meagain <me1@me.com>

另外,哪个正则表达式将匹配消息?

【问题讨论】:

我并没有真正关注您...在您的示例中,您不希望它与 3 封电子邮件匹配吗? 您的意思是您正在解析电子邮件地址而不仅仅是电子邮件? @oscar 是的,我需要匹配每个字段的所有电子邮件,例如 TO、Bcc 和 Cc。匹配项应仅匹配一个字段,即 TO 字段中的所有电子邮件 【参考方案1】:

用正则表达式解析电子邮件是一个糟糕的主意。您也许可以使用正则表达式解析组成部分,但是找到使用正则表达式的组成部分会很适合您。

当然,正常情况很简单。但是随后您会遇到诸如消息之类的东西,其中包含嵌入的消息。也就是说,内容包括完整的电子邮件消息,其中包含 From:、To:、Bcc: 等。而你天真的正则表达式解析器会认为,“哦,男孩!我发现了一条新消息!”

你最好阅读和理解 Internet Message Format 并编写一个真正的解析器,或者使用像 OpenPop.NET 这样已经写好的东西。

另外,请查看Reading Email using Pop3 in C# 和https://***.com/questions/26606/free-pop3-net-library 等中的建议。

您将面临的困难的一个很好的例子是您匹配电子邮件地址的正则表达式不充分。根据 RFC2822 的第 3.2.4 节(上面链接),电子邮件地址的“本地部分”中允许使用以下字符:

atext = ALPHA / DIGIT / ; Any character except controls,
        "!" / "#" /     ;  SP, and specials.
        "$" / "%" /     ;  Used for atoms
        "&" / "'" /
        "*" / "+" /
        "-" / "/" /
        "=" / "?" /
        "^" / "_" /
        "`" / "" /
        "|" / "" /
        "~"

域名可以包含除空格和“\”字符之外的任何ASCII,并且必须满足一些格式要求。然后是“过时”的东西,虽然已被弃用,但仍在使用。这只是解析电子邮件地址。如果您查看可以包含在其他字段中的内容,我想您会同意尝试使用正则表达式解析它充其量是令人沮丧的。

【讨论】:

【参考方案2】:

http://www.codeproject.com/KB/office/reading_an_outlook_msg.aspx

以上教程将让您了解如何从文件系统中读取 *.msg 文件。如果您考虑使用 System.Net.Mail.MailMessage 对象,您可以获得所有信息,例如:

发件人, 收件人, 附件, html电子邮件模板, 文本电子邮件模板, 等等……

谢谢,

【讨论】:

【参考方案3】:

我创建了一个名为 SigParser 的 API,它可以为您完成这项工作。它将回复链电子邮件分解为各个部分,并处理这些线路分裂的问题。如果该数据位于回复链标题中,您将获得一组很好的电子邮件响应正文,其中包含电子邮件的每个部分的收件人。

【讨论】:

以上是关于在 C# 中使用正则表达式解析电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 字符串中摆脱零宽度空间的最简单方法

C# 中用于电子邮件验证的最佳正则表达式

如何在 C# 中使用正则表达式解析重复的名称-值对

使用 C# 中的正则表达式操作检查 EditText 上的有效电子邮件 [关闭]

C# MVC 4 应用程序中的电子邮件地址验证:使用或不使用正则表达式 [重复]

使用正则表达式 C# 解析字幕文件