2009-04-24 3 views
7

get_payloadで違和感を覚えています:デコードしているメッセージに等号が見えるときは間違っているようです。ここでは、エラーを表示するコードです:Python:等号を打つと、get_payloadのデコードが失敗しますか?

import email 

data = file('testmessage.txt').read() 
msg = email.message_from_string(data) 
payload = msg.get_payload(decode=True) 
print payload 

は、そしてここにサンプルメッセージです:test message

メッセージは、最初の "="までのみ表示されます。残りは省略されています。誰が何が起こっているのか知っていますか?

"decode = False"と同じスクリプトは、完全なメッセージを返します。そのため、デコードは等号と不一致です。

これはPython 2.5の下にあります。

答えて

6

あなたは行末の問題があります。あなたのテストメッセージの本文は改行なし(\ n)で裸のキャリッジリターン(\ r)を使用します。電子メールを解析する前に改行を修正すると、それはすべて動作します:

import email, re 
data = file('testmessage.txt').read() 
data = re.sub(r'\r(?!\n)', '\r\n', data) # Bare \r becomes \r\n 
msg = email.message_from_string(data) 
payload = msg.get_payload(decode=True) 
print payload 
+0

Thanks Richie、that works。しかし、私はテキストではない添付ファイルも扱っているので、おそらく再置換を無差別にやりたいとは思わないでしょう。私はtext/plainを検出する必要があります。そして、代入だけを行う必要があります。これは、メッセージ部分のMIMEタイプがmessage_from_stringコールを過ぎているので、ちょっと微妙です。 get_payload呼び出しの外部で別々にデコードを呼び出すことはできますか? – Parand

+1

真のバイナリ添付ファイルを扱うことは確実でしょうか?添付ファイルは、通常、base64などを使用して電子メール内でエンコードされるため、バイナリファイルを表すものの、電子メール内のテキストとしてエンコードされます。 – RichieHindle

+0

あなたはもう一度そうです。私はかなりの数の例を使ってテストしましたが、皆さんが提案した代入で問題なく動作します。再度、感謝します。 – Parand

関連する問題