2

皆さんが行く前に、正規表現はすべての悪の縮図であると私に言います...私はすでに知っています。もし私がもっと髪を持っていたら、それはすでに引き裂かれているでしょう。

では、質問に移りましょう。HTMLメールの目的の部分を取り除く正規表​​現を使用してパーサーを作成しました。一体なぜ私はそれをしたいのですか?私はまだ初心者プログラマーなので、もっと良い方法を提案できるなら、ぜひ...そうしてください。パーサーは、電子メールの通常のhtml部分で完全に機能しますが、誰かが私と電子メールを1つ(またはそれ以上)の添付ファイルで送信した場合...

すべての地獄が緩む!

通常の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電子メール構造をグーグルで検索できます。特定の正規表現で答えようとするのではなく、電子メールの構造を少し説明しようと思います(主に、正規表現があなたの望むことを実行するかどうかわからないためです)。

生のメールを見ると、次のことがわかります。

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

これはMIME境界であり、MIME電子メールメッセージの個々の部分を分離します。MIME電子メールメッセージには、HTMLバージョンの電子メール、プレーンテキストバージョン、ファイルまたは画像の添付ファイルなど、多くの部分を含めることができます。境界に続く2行を見ると、MIMEタイプを使用して、次の部分が何であるかを説明しています。

生の電子メールの上部を見ると、「Content-Type」ヘッダーが表示されます。マルチパートMIMEメッセージでは、このヘッダーの後に「boundary=」セクションが続く必要があります。(上記のように)その境界を取り、それを使用して電子メールの断片を分割することができます。

正規表現を介して行うのが難しいと思うのは、境界が電子メールごとに異なるため、一部のコードにより適しているということです。RegExを使用して境界を見つけ、次にメッセージを分割するためのロジックを使用することをお勧めします。たとえば、次のようになります。

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

利用可能なオープンソースのC#MIMEパーサーがいくつかあります。

最後の2つは少し古いです。簡単にコンパイルできない場合は、ソースが正しい方向を示している可能性があります。

電子メールには、添付ファイルなどを含む電子メールである添付ファイルを含めることができることを忘れないでください...ある時点で、正規表現はあなたを失望させます。

于 2010-06-18T19:19:48.307 に答える
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 に答える
0

このサイトは初めてで、仕事に戻る前に数分間じっくり見て回っています。

ここでのこのこと: " -1b4078c9-04f5-4cca-a220-e5b30eddef46 "は、受信電子メールメッセージのヘッダーでMIME部分区切り文字として宣言された文字列です。それを探して保存します。

その文字列で区切られた各MIME部分は、2つのセクションに分割されているように見えます。名前と値の値のリストと、空白行で区切られたセクションの「実際のコンテンツ」です。私が今言ったことを言ういくつかの毛深いMIME標準があると私はかなり確信しています。:)最初の( "属性")セクションで、必要なコンテンツタイプ(text / html)を探します。それを見つけたら、次の空白行を探し、それを見つけたら、次のMIME部分の区切り文字までコンテンツを吸い込みます。これがHTMLメールメッセージになり、処理できます。

1つの壮大な正規表現でこれらすべてを行うことはできないと私は信じています。着信メッセージの各行にループをコーディングし、ステートマシンのようなことを行う必要があります。状態は次のようになります。

(1)Mime部分の区切り文字が不明(2)Mime部分の区切り文字が既知、mime部分が表示されない(3)Mime部分が表示される、タイプがhtmlではない(4)Mime部分が表示される、タイプがhtml、空白行が表示されない(5)空白行が表示される、 mimeパーツ区切り文字が表示されない(6)mimeパーツ区切り文字が表示される(処理の終了)

私は非常に速く、緩く、ずさんです。お役に立てれば。

ジョン。

于 2010-06-18T19:00:12.500 に答える