c# - 使用正则表达式分隔多部分电子邮件

标签 c# regex email multipart

在你们告诉我正则表达式是所有邪恶的缩影之前……我已经知道了。如果我有更多的头发,它已经被扯掉了。

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

一切 hell 都崩溃了!

我得到的不是普通的 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 版本与文本版本分开?

最佳答案

这有点复杂,但如果您想了解细节,可以通过谷歌搜索 MIME 电子邮件结构。我将尝试解释一下电子邮件结构,而不是尝试使用特定的正则表达式来回答(主要是因为我不确定正则表达式是否会执行您想要的操作)。

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

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

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

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

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

myMessage.Split(myBoundary)

关于c# - 使用正则表达式分隔多部分电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3072288/

相关文章:

javascript正则表达式删除空格和字母

regex - 在Pig脚本中使用正则表达式从日志中提取字符串

iphone - 如何在 iOS 中注册自定义文件类型

email - 如何避免在群发邮件时被 Gmail 标记为垃圾邮件?

c# - 传递到字典中的模型项是 .. 类型的,但是这个字典需要一个类型的模型项

c# - 如何替换许多基于文本的文件中的变量值

c# - MassTransit 消息类型不得为系统类型异常

c# - 无法在 ssl 模式下使用端口 25 发送电子邮件?

c# - .net mvc 路由贪婪正则表达式

email - 阻止 Gmail 创建 URL 和电子邮件地址的链接