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

Smi*_*ith 4 c# regex parsing

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

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

"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"
Run Code Online (Sandbox Code Playgroud)

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

To: Me meagain <me@me.com>,
    Me1 meagain <me1@me.com>,Me3 meagain <me1@me.com>
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*hel 5

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

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

您最好阅读和理解Internet 消息格式并编写一个真正的解析器,或者使用已经编写的诸如OpenPop.NET 之类的东西

此外,请查看使用 C# 中的 Pop3/sf/ask/1862451/阅读电子邮件中的建议。

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

atext = ALPHA / DIGIT / ; Any character except controls,
        "!" / "#" /     ;  SP, and specials.
        "$" / "%" /     ;  Used for atoms
        "&" / "'" /
        "*" / "+" /
        "-" / "/" /
        "=" / "?" /
        "^" / "_" /
        "`" / "{" /
        "|" / "}" /
        "~"
Run Code Online (Sandbox Code Playgroud)

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