使用c#中的正则表达式解析电子邮件

时间:2011-05-19 09:01:32

标签: c# regex parsing

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

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

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

我遇到的问题是To,Cc和Bcc有时包含多个电子邮件,并且出现在多行中

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

另外,请查看Reading Email using Pop3 in C#https://stackoverflow.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,并且必须满足某些格式要求。然后是“过时的”东西虽然已被弃用,但仍在使用中。这只是在解析电子邮件地址。如果你看一下可以包含在其他字段中的东西,我想你会同意尝试用正则表达式解析它会让你感到沮丧。

答案 1 :(得分:0)

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

上面的教程将为您提供一个如何从文件系统中读取* .msg文件的好主意。如果您考虑使用System.Net.Mail.MailMessage对象,您可以获得所有信息,例如:

发件人, 受助, 附着物, HTML电子邮件模板, 文字电邮模板, 等...

谢谢,

答案 2 :(得分:0)

我创建了一个名为SigParser的API,它会为您完成此操作。它将回复链电子邮件分解为其部分,并处理线路分裂的这些问题。如果该数据位于回复链标题中,您将获得一系列电子邮件响应正文,其中包含电子邮件的每个部分。