2011-08-02 116 views
14

我使用Python模塊MimeWriter構造消息和的smtplib發送郵件構造信息是:編碼郵件主題(SMTP)在Python與非ASCII字符

file msg.txt: 
----------------------- 
Content-Type: multipart/mixed; 
from: me<[email protected]> 
to: [email protected] 
subject: 主題 

Content-Type: text/plain;charset=utf-8 

主題 

我使用下面的代碼來發送郵件:

import smtplib 
s=smtplib.SMTP('smtp.abc.com') 
toList = ['[email protected]'] 
f=open('msg.txt') #above msg in msg.txt file 
msg=f.read() 
f.close() 
s.sendmail('[email protected]',toList,msg) 

我得到正確的郵件正文,但主題是不妥當的,

subject: some junk characters 

主題   <- body is correct. 

請發uggest?有沒有什麼辦法來指定要用於題目也 作爲主體被指定的解碼。我怎樣才能正確解碼主題?

+1

噢中國字符在發佈問題後出現亂碼 – Rakesh

+0

相關閱讀:[?我如何發送使用Python電子郵件(http://stackoverflow.com/q/9272257/4279) – jfs

回答

23

來自http://docs.python.org/library/email.header.html

from email.message import Message 
from email.header import Header 
msg = Message() 
msg['Subject'] = Header('主題', 'utf-8') 
print msg.as_string() 

主題:= UTF-8b的5Li76aGM =

更簡單:????????

from email.header import Header 
print Header('主題', 'utf-8').encode() 

= UTF-8b的5Li76aGM =

+1

這應該是被接受的答案。 –

6

拍攝對象作爲SMTP報頭中發送,並且它們必須是ASCII -only。爲了支持編碼的主題,你需要前綴要使用什麼編碼的主題。在你的情況下,我會建議用UTF-8?B前綴主題。這意味着UTF-8Base64編碼。

換句話說,我相信你的主題標題應該更多或像這樣少的樣子:

Subject: =?UTF-8?B?JiMyMDAyNzsmIzM4OTg4Ow=?= 

在PHP中,你可以去了解它是這樣的:

// Convert subject to base64 
$subject_base64 = base64_encode($subject); 
fwrite($smtp, "Subject: =?UTF-8?B?{$subject_base64}?=\r\n"); 

在Python:

import base64 
subject_base64 = base64.encodestring(subject).strip() 
subject_line = "Subject: =?UTF-8?B?%s?=" % subject_base64 
+1

我會試試這個,其間沒有任何的Python API轉換成以上格式。即根據所需的編碼自動添加字符 – Rakesh

+1

我不確定 - 我剛剛記得那段時間我剛纔在討論這個問題。 [這個答案](http://stackoverflow.com/questions/5910104/python-how-to-send-utf-8-e-mail#answer-5910530)似乎表明,它是做正確的,如果你使用MimeMultipart的而不是MimeWriter。 – AHM

+2

你應該在這裏看看[如何生成國際化標題](http://docs.python.org/library/email.header.html) – mata