2

在你们告诉我正则表达式是万恶之源之前……我已经知道了。如果我有更多的头发,它就会被撕掉。

那么问题来了。我已经使用正则表达式制作了一个解析器,它去除了 html 电子邮件的所需部分。我到底为什么要这样做?因为我仍然是一个初学者程序员,好吧,如果你能提出更好的方法,那么无论如何......做。解析器可以完美地处理电子邮件的普通 html 部分,但是如果有人向我发送电子邮件并仅包含一个附件(或更多)......

所有的地狱都松了!

我没有得到普通的 html 电子邮件的样子,而是得到了纯文本版本,其中 html 版本连接到末尾,如下所示:

--_1b4078c9-04f5-4cca-a220-e5b30eddef46_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


To: ****@****=3B ****@**** | Emmanuel Smith=3B=
 Jonny Barnes
cc: |bcc: |Ref: Test123
---

Lorem ipsum dolor sit amet=2C consectetur adipiscing elit. Praesent in augu=
e nec justo tempor varius eu et tellus. Nunc id massa tortor=2C ut lobortis=
 sem. Class aptent taciti sociosqu ad litora torquent per conubia nostra=2C=
 per inceptos himenaeos. Maecenas quis nisl nec quam tristique posuere sed =
at nibh. Cras fringilla vestibulum metus vel porttitor. 2 + 2 =3D 7 Cras ia=
culis=2C erat nec gravida accumsan=2C metus felis vestibulum risus=2C quis =
venenatis nisl nulla sed diam. Aenean quis viverra velit. Etiam quis massa =
lectus=2C faucibus facilisis sem. Curabitur non eros tellus. Sed at ligula =
neque. Donec elementum rhoncus volutpat. Curabitur eu accumsan erat. Phasel=
lus auctor odio dolor=2C ut ornare augue. Suspendisse vel est nibh. Vivamus=
 facilisis placerat augue sit amet aliquam. Maecenas viverra=2C ipsum a tin=
cidunt elementum=2C arcu tellus rutrum ipsum=2C et dignissim urna orci ac m=
i. Vivamus non odio massa. Nulla congue massa eu leo pretium non consequat =
urna molestie.



Integer neque odio=2C scelerisque at molestie quis=2C congue sed arcu. Prae=
sent a arcu odio. Donec sollicitudin=2C quam vel tincidunt lobortis=2C urna=
 augue cursus lorem=2C in eleifend nunc risus nec neque. Donec euismod maur=
is non nibh blandit sollicitudin. Vivamus sed tincidunt augue. Suspendisse =
iaculis massa ut tellus rutrum auctor. Cras venenatis consequat urna in viv=
erra. Ut blandit imperdiet dolor non scelerisque. Suspendisse potenti. Sed =
vitae lacus ac odio euismod tempus. Aenean ut sem odio. Curabitur auctor pu=
rus a diam iaculis facilisis. Integer molestie commodo mauris a imperdiet. =
Nunc aliquet tempus orci sit amet viverra.

                     =20
Hotmail is redefining busy with tools for the New Busy. Get more from your =
inbox. See how.                      =20
_________________________________________________________________
The New Busy is not the old busy. Search=2C chat and e-mail from your inbox=
..
http://www.windowslive.com/campaign/thenewbusy?ocid=3DPID28326::T:WLMTAGL:O=
N:WL:en-US:WM_HMP:042010_3=

--_1b4078c9-04f5-4cca-a220-e5b30eddef46_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>
<head>
<style><!--
..hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 10pt=3B
font-family:Verdana
}
--></style>
</head>
<body class=3D'hmmessage'>
To: ****@**** ****@**** | Emmanuel Smith=3B=
 Jonny Barnes<br><div>cc: |</div><div>bcc: |</div><div>Ref: Test123</div><d=
iv><br><span class=3D"ecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxec=
xecxApple-style-span" style=3D"font-family:Tahoma=2C Verdana=2C Arial=2C sa=
ns-serif=3Bcolor:rgb(68=2C 68=2C 68)"><font class=3D"ecxecxecxecxecxecxecxe=
cxecxecxecxecxecxecxecxApple-style-span" color=3D"#000000"><font class=3D"e=
cxecxecxecxecxecxApple-style-span" face=3D"Verdana">---<br></font></font><d=
iv><font class=3D"ecxecxecxecxecxecxApple-style-span" face=3D"Verdana"><br>=
</font></div><div><span class=3D"ecxecxecxecxecxecxecxecxecxecxecxecxecxecx=
ecxecxecxecxecxecxecxecxecxecxecxecxecxecxApple-style-span" style=3D"font-s=
ize:11px=3Bline-height:14px"><font class=3D"ecxecxecxecxecxecxApple-style-s=
pan" face=3D"Verdana">Lorem ipsum dolor sit amet=2C consectetur adipiscing =
elit. Praesent in augue nec justo tempor varius eu et tellus. Nunc id massa=
 tortor=2C ut lobortis sem. Class aptent taciti sociosqu ad litora torquent=
 per conubia nostra=2C per inceptos himenaeos. Maecenas quis nisl nec quam =
tristique posuere sed at nibh. Cras fringilla vestibulum metus vel porttito=
r. 2 + 2 =3D 7 Cras iaculis=2C erat nec gravida accumsan=2C metus felis ves=
tibulum risus=2C quis venenatis nisl nulla sed diam. Aenean quis viverra ve=
lit. Etiam quis massa lectus=2C faucibus facilisis sem. Curabitur non eros =
tellus. Sed at ligula neque. Donec elementum rhoncus volutpat. Curabitur eu=
 accumsan erat. Phasellus auctor odio dolor=2C ut ornare augue. Suspendisse=
 vel est nibh. Vivamus facilisis placerat augue sit amet aliquam. Maecenas =
viverra=2C ipsum a tincidunt elementum=2C arcu tellus rutrum ipsum=2C et di=
gnissim urna orci ac mi. Vivamus non odio massa. Nulla congue massa eu leo =
pretium non consequat urna molestie.</font></span></div><div><span class=3D=
"ecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxec=
xecxecxecxApple-style-span" style=3D"font-size:11px=3Bline-height:14px"><fo=
nt class=3D"ecxecxecxecxecxecxApple-style-span" face=3D"Verdana"><br></font=
></span></div><div><span class=3D"ecxecxecxecxecxecxecxecxecxecxecxecxecxec=
xecxecxecxecxecxecxecxecxecxecxecxecxecxecxApple-style-span" style=3D"font-=
size:11px=3Bline-height:14px"><font class=3D"ecxecxecxecxecxecxApple-style-=
span" face=3D"Verdana"><br></font></span></div><div><span class=3D"ecxecxec=
xecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxec=
xApple-style-span" style=3D"font-size:11px=3Bline-height:14px"><font class=
=3D"ecxecxecxecxecxecxApple-style-span" face=3D"Verdana"><br></font></span>=
</div><div><font class=3D"Apple-style-span" face=3D"Verdana" size=3D"3"><sp=
an class=3D"Apple-style-span" style=3D"font-size: 11px=3B line-height: 14px=
=3B"><br></span></font></div><span class=3D"ecxecxecxecxecxecxecxecxecxecxe=
cxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxecxe=
cxecxecxecxecxApple-style-span" style=3D"font-family:Arial=2C Helvetica=2C =
sans=3Bfont-size:11px"><p style=3D"margin-right:0px=3Bmargin-bottom:14px=3B=
margin-left:0px=3Btext-align:justify=3Bfont-size:11px=3Bline-height:14px=3B=
padding-top:0px=3Bpadding-right:0px=3Bpadding-bottom:0px=3Bpadding-left:0px=
"><font class=3D"ecxecxecxecxecxecxApple-style-span" face=3D"Verdana">Integ=
er neque odio=2C scelerisque at molestie quis=2C congue sed arcu. Praesent =
a arcu odio. Donec sollicitudin=2C quam vel tincidunt lobortis=2C urna augu=
e cursus lorem=2C in eleifend nunc risus nec neque. Donec euismod mauris no=
n nibh blandit sollicitudin. Vivamus sed tincidunt augue. Suspendisse iacul=
is massa ut tellus rutrum auctor. Cras venenatis consequat urna in viverra.=
 Ut blandit imperdiet dolor non scelerisque. Suspendisse potenti. Sed vitae=
 lacus ac odio euismod tempus. Aenean ut sem odio. Curabitur auctor purus a=
 diam iaculis facilisis. Integer molestie commodo mauris a imperdiet. Nunc =
aliquet tempus orci sit amet viverra.</font></p><p style=3D"margin-right:0p=
x=3Bmargin-bottom:14px=3Bmargin-left:0px=3Btext-align:justify=3Bfont-size:1=
1px=3Bline-height:14px=3Bpadding-top:0px=3Bpadding-right:0px=3Bpadding-bott=
om:0px=3Bpadding-left:0px"><font class=3D"ecxecxecxecxecxecxApple-style-spa=
n" face=3D"Verdana"><br></font></p><p style=3D"margin-right:0px=3Bmargin-bo=
ttom:14px=3Bmargin-left:0px=3Btext-align:justify=3Bfont-size:11px=3Bline-he=
ight:14px=3Bpadding-top:0px=3Bpadding-right:0px=3Bpadding-bottom:0px=3Bpadd=
ing-left:0px"><font class=3D"Apple-style-span" face=3D"Verdana"><br></font>=
</p></span></span></div>                      <br><hr>Hotmail is redefining busy with=
 tools for the New Busy. Get more from your inbox. <a href=3D"http://www.wi=
ndowslive.com/campaign/thenewbusy?ocid=3DPID28326::T:WLMTAGL:ON:WL:en-US:WM=
_HMP:042010_2">See how.</a>                       <br /><hr />The New Busy is not the =
old busy. Search=2C chat and e-mail from your inbox. <a href=3D'http://www.=
windowslive.com/campaign/thenewbusy?ocid=3DPID28326::T:WLMTAGL:ON:WL:en-US:=
WM_HMP:042010_3' target=3D'_new'>Get started.</a></body>
</html>=

--_1b4078c9-04f5-4cca-a220-e5b30eddef46_--

所以我的问题是......如何使用正则表达式(或更简单的方法)将 html 版本与文本版本分开?

4

4 回答 4

3

这有点复杂,但如果你想深入了解细节,你可以谷歌 MIME 电子邮件结构。我将尝试稍微解释一下电子邮件结构,而不是尝试使用特定的 RegEx 来回答(主要是因为我不确定 RegEx 是否会满足您的要求)。

如果您查看原始电子邮件,您会看到:

-- 1b4078c9-04f5-4cca-a220-e5b30eddef46

这是 MIME 边界,它将 MIME 电子邮件的各个部分分开。MIME 电子邮件消息可以包含许多部分,包括电子邮件的 HTML 版本、纯文本版本以及文件或图像附件。如果您查看边界之后的两条线,它们会通过使用 MIME 类型来解释即将到来的部分是什么。

如果您查看原始电子邮件的顶部,您将看到“Content-Type”标头,在多部分 MIME 消息中,该标头后面应跟随“boundary=”部分。您可以采用该边界(如上所示)并使用它来分解电子邮件的各个部分。

我认为通过 RegEx 难以做到的是每封电子邮件的边界都会不同,因此它更适用于某些代码。您可能想使用正则表达式来查找边界,然后使用一些逻辑来分解消息,可能类似于:

myMessage.Split(myBoundary)
于 2010-06-18T18:53:50.973 回答
2

有一些可用的开源 C# MIME 解析器:

最后两张有点老了。如果他们不容易编译,他们的来源可能会为您指明正确的方向。

请记住,电子邮件可以包含附件,即包含附件等的电子邮件……在某些时候,Regex 会让您失望。

于 2010-06-18T19:19:48.307 回答
0

刚到这个网站,在回去工作之前只是闲逛了几分钟。

此处的内容:“-- 1b4078c9-04f5-4cca-a220-e5b30eddef46 ”是在传入电子邮件的标题中声明为 MIME 部分分隔符的字符串。寻找并保存它。

看起来由该字符串分隔的每个 MIME 部分都分为两部分:名称值列表和该部分的“真实内容”,由空行分隔。我很确定有一些毛茸茸的 MIME 标准可以说明我刚才所说的。:) 在第一个(“属性”)部分中,查找您想要的内容类型(文本/html)。一旦你找到它,寻找下一个空白行,一旦你找到了,就吸纳内容直到下一个 MIME 部分分隔符。这将是您的 html 电子邮件,然后您可以对其进行处理。

我相信,您将无法使用一个出色的正则表达式来完成所有这些工作。您必须在传入消息的每一行上编写一个循环,并执行状态机排序。状态将类似于:

(1) Mime 部分分隔符未知 (2) Mime 部分分隔符已知,mime 部分不可见 (3) Mime 部分可见,类型不是 html (4) Mime 部分可见,类型为 html,空行不可见 (5) 空行可见, mime part delimiter unseen (6) mime part delimiter seen (处理结束)

我非常快,松散,邋遢。希望这可以帮助。

约翰。

于 2010-06-18T19:00:12.500 回答
0

在我看来,您的电子邮件的 HTML 部分在 之后不久就开始了Content-Type: text/html;,所以我想说那几行将是表明 HTML 正在开始的一个很好的标记。至于正则表达式,我认为这样做可以(.+)Content-Type: text/html; charset="iso-8859-1"(.+)。您输入的文本部分将在捕获组 1 中,而 HTML 部分将在捕获组 2 中。您必须能够设置一个选项,以便.匹配\n以及其他字符。

于 2010-06-18T18:57:51.563 回答