Domanda

Prima che voi ragazzi mi diciate che Regex è l'epitome di tutto il male...Lo so già.Se avessi più capelli sarebbero già strappati.

Quindi veniamo alla domanda.Ho creato un parser utilizzando regex che elimina le parti desiderate di un'e-mail html.Perché mai dovrei volerlo fare?Perché sono ancora un programmatore principiante, ok, se puoi suggerirmi un modo migliore, allora sicuramente...Fare.Il parser funziona perfettamente sulle normali parti html di un'e-mail, tuttavia se qualcuno mi invia un'e-mail con un solo allegato (o più)...

SI SCATENA L'INFERNO!

Invece di ottenere l'aspetto di una normale email html, ottengo la versione in testo semplice con la versione html concatenata alla fine in questo modo:

--_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_--

Quindi la mia domanda è...Come posso separare la versione html dalla versione testo utilizzando regex (o con mezzi più semplici)?

È stato utile?

Soluzione

Ci sono un paio di open source C # MIME parser disponibili:

Gli ultimi due sono un po 'vecchio. Se non lo fanno facilmente compilare, la loro fonte potrebbe puntare nella giusta direzione.

Ricordate, una e-mail può contenere un allegato che è una e-mail contenente un allegato, ecc, ecc ... Ad un certo punto, Regex vi deluderà.

Altri suggerimenti

Questo diventa un po' complicato, ma puoi cercare su Google le strutture email MIME se vuoi entrare nel nocciolo della questione.Cercherò di spiegare un po' la struttura dell'e-mail piuttosto che tentare di rispondere con una RegEx specifica (principalmente perché non sono sicuro che una RegEx faccia ciò che desideri).

Se guardi le tue email grezze vedrai:

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

Questo è il confine MIME, separa le singole parti di un messaggio di posta elettronica MIME.Un messaggio di posta elettronica MIME può contenere molte parti, inclusa una versione HTML del messaggio di posta elettronica, una versione di testo semplice, nonché allegati di file o immagini.Se guardi le due righe che seguono il confine, spiegano quale sarà la parte successiva utilizzando il suo tipo MIME.

Se guardi la parte superiore dell'e-mail non elaborata, vedrai l'intestazione "Content-Type", che in un messaggio MIME multiparte dovrebbe essere seguita da una sezione "boundary=".Puoi prendere quel confine (come mostrato sopra) e usarlo per suddividere i pezzi della tua email.

Ciò che penso renda difficile farlo tramite RegEx è che il confine sarà diverso per ogni email, quindi è qualcosa che è più applicabile ad alcuni codici.Potresti voler utilizzare una RegEx per trovare il confine e quindi una logica per suddividere il messaggio, magari qualcosa del tipo:

myMessage.Split(myBoundary)

Sembra a me che la parte HTML del vostro e-mail inizia poco dopo Content-Type: text/html;, quindi direi che quelle poche righe sarebbe un buon token per indicare che il codice HTML è begining. Per quanto riguarda una regex, credo che questo farebbe (.+)Content-Type: text/html; charset="iso-8859-1"(.+). La parte di testo del vostro contributo sarà in gruppo cattura 1, e la parte HTML in gruppo di cattura 2. Bisogna essere in grado di impostare un'opzione in modo che le partite . \n così come altri personaggi.

Nuovo in questo sito, solo Pölking intorno per alcuni minuti prima di andare a lavorare di nuovo.

Questa cosa qui: "- 1b4078c9-04f5-4cca-A220-e5b30eddef46 " è una stringa dichiarata come una parte di separazione MIME nelle intestazioni del messaggio in arrivo. Cercare e salvarlo.

appare come ciascuna parte MIME delimitata da che le interruzioni stringa scorrimento in due sezioni: una lista di valori nome-valore e quindi il "contenuto vero" della sezione, separata da una riga vuota. Sono abbastanza sicuro che c'è qualche standard MIME peloso che dice quello che ho appena detto. :) Nella prima sezione ( "attributi"), cercare il tipo di contenuto che si desidera (text / html). Una volta che hai trovato, look per la prossima riga vuota, e una volta scoperto che, aspirare il contenuto fino a quando la parte delimitatore successivo MIME. Questo sarà il messaggio di posta elettronica HTML, che può essere poi di processo.

Non sarà in grado di fare tutto questo con con una magnifica espressione regolare, credo. Dovrete codificare un ciclo su ogni riga del messaggio in arrivo, e fare una sorta stato della macchina cosa. Uniti sarà qualcosa di simile:

(1) Mime parte delimitatore sconosciuto delimitatore parte (2) Mime noto, parte invisibile mimo (3) Mime parte visto, digitare non html (4) Mime parte visto, tipo è html, riga vuota non visto (5) Riga vuota visto, parte mimo delimitatore invisibile (6) Mime parte delimitatore visto (fine del trattamento)

devo essere molto veloce, sciolto, sciatta. Spero che questo aiuti.

John.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top