2017-06-13 10 views
0

Python 3を使用して、私はmboxファイルから電子メールを解析しようとしています。Python decode_headerは元の文字列を分割します

for message in mailbox.mbox('file'): 
    sender = message['From'] 
    c = decode_header(sender) 

生の電子メールがcこの場合

[(b'"', None), (b'Mark from Site', 'utf-8'), (b'" <[email protected]>', None)] 

ある、

From: "=?UTF-8?Q?Mark_from_Site?=" <[email protected]> 

とにかくこのユニークFrom:ヘッダを有し、行が予期せずに"引用符を次の分割され複数の要素。

"の数に応じて、リストに定義されていない数(上記のように必ずしも3つではない)が存在する可能性があり、分割の原因が他にもある可能性があるため、扱いが煩雑な場合があります。

文字列エンコーディングがない場合(ヘッダーが純粋な場合はascii)、分割されず、c"Mark from Site" <[email protected]>です。

asciiエンコーディングでもこの分割を避ける方法はありますか?

そうでなければ、この種のヘッダーを正しく解析する方法はありますか?

答えて

0

あなたの文字列とそれがでエンコードされなければならない文字セットでemail.header.Headerのインスタンスを作成することによって、あなたのためのemail.headerモジュールハンドルのエンコーディングを持つことができます。

from email.header import Header 

for message in mailbox.mbox('file'): 
    sender = Header(message['From'], "utf-8") 
    c = decode_header(sender) 
+0

これは実際には文字列を分割しません。しかし今、ヘッダーのエンコーディングは、すべてが「utf-8」であるかのようにみなされます。代わりに 'Header(message ['From'])'を使うと、すべてのメッセージは 'us-ascii'とみなされます。 'Header'が正しいエンコーディングをそれ自身で認識させる方法はありますか? – BowPark

1

何最も単純なことをやっについて、すなわち。すべての部分をUnicodeに変換してから貼り付けます。

from = ''.join(t[0].decode(t[1] if t[1] else 'UTF-8') for t in decode_header(sender))