2011-07-06 44 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,應用轉義,然後最終轉換爲字節進行傳輸,所以爲什麼我不能設置字節有效載荷?

我該如何去獲得一個最佳的非MIME消息,其中smtplib.SMTP.send_message將接受字節有效載荷?

+1

您可能必須將其編碼爲字符串。我不知道Python中有什麼可用,但通常是Base-64。 –

+1

無論你如何操作,如果你可以做到這一點,非ASCII,非MIME類型的郵件將在接收方和可能在任何中間郵件傳輸代理上出現問題。 「麻煩」意思是「難解釋」或「反彈」或「丟棄」。 – msw

+1

@msw - 死亡的郵件代理誰仍然只有ASCII! :) – mac

回答

2

請記住:在Python 3中的字符串是全部是 unicode。您實際上正在給Python一個字節對象,然後告訴它你想要一個unicode字符串,但不告訴它使用哪種編碼將字節對象轉換爲字符串。

你需要做的是提供編碼作爲第二個參數set_payload()調用,就像這樣:

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類型的信息 - 希望這會爲你工作。

+0

你能解釋一下你對latin1的選擇嗎? –

+0

latin1和unicode對於前256個字符是相同的,所以字節在'解碼'過程中不會改變。 –

相關問題