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

4

我需要使用C#中的正则表达式来解析电子邮件文件,即解析包含多封电子邮件的邮件文件并将其解析为其组成部分,例如发件人、收件人、密送等。

我正在使用的电子邮件正则表达式是

"\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>

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

1
我不是很明白你的意思...在你的例子中,你不想让它匹配3封电子邮件吗? - Oscar Mederos
2
你的意思是你正在解析电子邮件地址而不仅仅是电子邮件吗? - Mongus Pong
@oscar 是的,我需要匹配每个字段(例如TO、Bcc和Cc)中的所有电子邮件。匹配应该只匹配一个字段,即在TO字段中的所有电子邮件。 - Smith
3个回答

5
使用正则表达式解析电子邮件消息是一个糟糕的想法。你可能能够使用正则表达式解析组成部分,但是使用正则表达式找到组成部分会让你感到困扰。
当然,正常情况下很容易处理。但是你可能会遇到嵌入在其中的电子邮件消息。也就是说,内容包括完整的电子邮件消息,包括发件人、收件人、密送等。而你的正则表达式解析器可能会认为,“哦,天啊!我找到了一条新消息!”
最好阅读和理解Internet Message Format,编写真正的解析器,或者使用已经编写好的工具,比如OpenPop.NET
此外,请查看在C#中使用POP3读取电子邮件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,并且必须满足一些格式要求。此外,还有一些“过时”的东西,虽然已被弃用但仍在使用。这些只是解析电子邮件地址的部分。如果你看看其他字段中可以包含的内容,我想你会同意,试图使用正则表达式来解析它可能会非常令人沮丧。

0

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

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

发件人, 收件人, 附件, HTML电子邮件模板, 文本电子邮件模板, 等等...

谢谢。


0
我创建了一个名为SigParser的API,可以帮助您完成这项工作。它可以将回复邮件链分解成各个部分,并处理行分割等问题。您将获得一个漂亮的电子邮件响应正文数组,其中包含每个电子邮件部分的收件人信息(如果该数据在回复邮件链头中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接