Использование регулярных выражений для разделения составной электронной почты - PullRequest
2 голосов
/ 18 июня 2010

Прежде чем вы, ребята, скажете мне, что Regex является воплощением всего зла ... Я уже знаю.Если бы у меня было больше волос, они были бы уже вырваны.

Итак, на вопрос.Я сделал парсер с помощью регулярных выражений, который удаляет нужные части 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 ]

3 голосов
/ 18 июня 2010

Это немного сложно, но вы можете использовать структуру электронной почты MIME, если хотите разобраться с мелочами. Я попытаюсь объяснить структуру электронной почты немного, а не пытаться ответить определенным RegEx (главным образом потому, что я не уверен, что RegEx сделает то, что вы хотите).

Если вы посмотрите свои необработанные письма, вы увидите:

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

Это граница MIME, она разделяет отдельные части сообщения электронной почты MIME. Сообщение электронной почты MIME может содержать много частей, включая HTML-версию электронной почты, текстовую версию, а также вложения файлов или изображений. Если вы посмотрите на две строки, следующие за границей, они объясняют, что такое предстоящая часть, используя ее тип MIME.

Если вы посмотрите на верхнюю часть исходного сообщения, вы увидите заголовок «Content-Type», за которым в сообщении MIME, состоящем из нескольких частей, должен следовать раздел «border =». Вы можете взять эту границу (как показано выше) и использовать ее, чтобы разбить фрагменты вашей электронной почты.

Я думаю, что с помощью RegEx сложно сделать то, что границы будут разными для каждого письма, поэтому это более применимо к некоторому коду. Возможно, вы захотите использовать RegEx, чтобы найти границу, а затем некоторую логику, чтобы разбить сообщение, может быть что-то вроде:

myMessage.Split(myBoundary)
2 голосов
/ 18 июня 2010

Доступно несколько парсеров C # MIME с открытым исходным кодом:

Последние два немного устарели. Если их нелегко скомпилировать, их источник может указать вам правильное направление.

Помните, что электронное письмо может содержать вложение, которое является электронным письмом с вложением и т. Д., И т. Д. ... В какой-то момент Regex подведет вас.

0 голосов
/ 18 июня 2010

Новое на этом сайте, просто прогуляйтесь несколько минут, прежде чем вернуться к работе.

Эта вещь здесь: "- 1b4078c9-04f5-4cca-a220-e5b30eddef46 " - это строка, объявленная как разделитель частей MIME в заголовках входящего сообщения электронной почты. Ищите и сохраняйте.

Похоже, что каждая часть MIME, разделенная этой строкой, разбивается на два раздела: список значений имя-значение и затем «реальное содержимое» раздела, разделенные пустой строкой. Я почти уверен, что есть какой-то волосатый стандарт MIME, который говорит то, что я только что сказал. :) В первом разделе («атрибуты») найдите нужный тип содержимого (text / html). Как только вы нашли его, ищите следующую пустую строку, и, как только вы нашли ТО, всасывайте содержимое до следующего разделителя MIME-части. Это будет ваше HTML-сообщение электронной почты, которое вы сможете затем обработать.

Вы не сможете сделать все это с одним великолепным регулярным выражением, я полагаю. Вы должны будете закодировать цикл над каждой строкой входящего сообщения и сделать что-то вроде конечного автомата. Штаты будут примерно такими:

(1) Разделитель части Mime неизвестен (2) Известный разделитель части мима, неизвестная часть мима (3) MIME часть видела, не HTML (4) MIME часть видна, тип HTML, пустая строка не видна (5) Видна пустая строка, разделитель части мима невидим (6) Видимый разделитель части мима (конец обработки)

Я очень быстрый, свободный, неаккуратный. Надеюсь, это поможет.

Джон.

0 голосов
/ 18 июня 2010

Мне кажется, что HTML-часть вашей электронной почты начинается вскоре после Content-Type: text/html;, поэтому я бы сказал, что эти несколько строк были бы хорошим признаком, указывающим на то, что HTML начинается. Что касается регулярного выражения, я думаю, что это будет делать (.+)Content-Type: text/html; charset="iso-8859-1"(.+). Текстовая часть вашего ввода будет в группе захвата 1, а часть HTML в группе захвата 2. Вы должны иметь возможность установить параметр так, чтобы . соответствовало \n, а также другим символам.

...