2011-07-06 8 views
5

followingは失敗します。Python3:バイナリデータを含むメールを送信しますか?

>>> a = email.message.Message() 
>>> a.set_payload(b'some data') 
>>> a.as_string() 
TypeError: string payload expected: <class 'bytes'> 

それも失敗した明示的に発電機を使用して、そしてflattenを呼び出します。メッセージ本体はASCIIに変換され、エスケープされ、最後に送信用のバイトに変換されます。なぜバイトペイロードを設定できないのですか?

smtplib.SMTP.send_messageが受け入れるバイトペイロードを使用して、好ましくは非MIMEメッセージを取得するにはどうすればよいですか?

+1

おそらく文字列にエンコードする必要があります。私はPythonで何が利用できるのか分からないが、通常Base-64にあるだろう。 –

+1

あなたがそれを行う方法にかかわらず、それを行うことができれば、非ASCII形式の非MIMEタイプのメールは受信側で、おそらく中間のメール転送エージェントで問題になるでしょう。 「トラブル」とは「解釈が困難」または「バウンス」または「破棄」を意味します。 – msw

+1

@msw - まだASCIIだけのメールエージェントへの死! :) – mac

答えて

2

注意:Python 3の文字列はすべてユニコードです。あなたは効果的にPythonにバイトオブジェクトを与えて、それからユニコード文字列を欲しいと言っていますが、バイトオブジェクトを文字列に変換するためにどのエンコーディングを使うべきかを伝えません。 - うまくいけば、あなたのために動作します

test = email.message.Message() 
test.set_payload(b'some example_data', 'latin1') # use latin-1 for no-op translation 
test.as_string() 

'MIME-Version: 1.0\nContent-Type: text/plain; charset="latin1"\nContent-Transfer-Encoding: base64\n\nc29tZSBleGFtcGxlIGRhdGE=\n' 

これは、MIMEタイプのメッセージを与えない:あなたがする必要がどのような

はそうのように、set_payload()呼び出しの2番目のパラメータとしての符号化を提供します。

+0

あなたはlatin1の選択について説明できますか? –

+0

latin1とunicodeは最初の256文字で同じなので、 'decode'プロセス中にバイトは変更されません。 –

関連する問題