我想在Python 3.2程序中發送具有任意unicode主體的電子郵件。但是,實際上,這些消息主要由7位ASCII文本組成。所以我想用uted-8使用quoted-printable編碼的消息。到目前爲止,我發現這個工作,但它似乎是錯誤的:如何使用Python 3.2電子郵件模塊發送帶有quoted-printable的utf-8編碼的unicode消息?
c = email.charset.Charset('utf-8')
c.body_encoding = email.charset.QP
m = email.message.Message()
m.set_payload("My message with an '\u05d0' in it.".encode('utf-8').decode('iso8859-1'), c)
這將導致電子郵件消息完全正確的內容:
To: [email protected]
From: [email protected]
Subject: This is a subjective subject.
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
My message with an '=D7=90' in it.
特別b'\xd7\x90'.decode('utf-8')
結果在原來的Unicode字符。所以quoted-printable
編碼正確地呈現utf-8
。我很清楚這是一個令人難以置信的醜陋黑客。但它的工作。
這是Python 3.預計文本字符串始終是unicode。我不應該將它解碼爲utf-8。然後將它從bytes
轉換回str
.decode('iso8859-1')
是一個可怕的黑客攻擊,我不應該這樣做。
它的email
模塊就編碼而言剛剛破裂?我沒有得到什麼嗎?
我試圖只是簡單的老設置它,沒有字符集。這給我留下了一個unicode電子郵件信息,這根本就不對。我也嘗試過關閉encode
和decode
的步驟。如果我將它們都關閉,它會在嘗試確定該字符是否需要用quoted-printable編碼引用時抱怨\u05d0
超出範圍。如果我只在encode
步驟中離開,它會非常抱怨我如何通過bytes
,並且它想要str
。
如果'「我在它的‘\ u05d0’的消息。」'是你想要的,那麼你就不能使用'「我的消息在‘\ u05d0’unicode的「。encode('utf-8')。decode('iso8859-1')'因爲這是一個不同的unicode。 (你會改變這個消息。) – unutbu 2012-02-22 21:52:49
@unutbu:恭喜你發現代碼非常醜陋的原因。但它的工作。它達到了預期的結果。查看我的更新。 – Omnifarious 2012-02-22 21:58:57