2013-04-18 11 views
5

Tôi đang sử dụng MIMEText để tạo email từ đầu trong Python 3.2 và tôi gặp sự cố khi tạo thư có ký tự không phải ascii trong chủ đề.Mã hóa tiêu đề trong MIMEText

Ví dụ

from email.mime.text import MIMEText 
body = "Some text" 
subject = "» My Subject"     # first char is non-ascii 
msg = MIMEText(body,'plain','utf-8') 
msg['Subject'] = subject     # <<< Problem probably here 
text = msg.as_string() 

Dòng cuối cùng mang lại cho tôi những lỗi

UnicodeEncodeError: 'ascii' codec can't encode character '\xbb' in position 0: ordinal not in range(128) 

Làm thế nào để nói với MIMEText rằng đối tượng không ascii? subject.encode('utf-8') không giúp gì cả, và dù sao tôi đã nhìn thấy những người sử dụng chuỗi unicode không có vấn đề trong câu trả lời khác (xem ví dụ Python - How to send utf-8 e-mail?)

Edit: Tôi muốn thêm rằng cùng một mã không cho bất kỳ lỗi nào trong Python 2.7 (nghĩ rằng điều đó không có nghĩa là kết quả là chính xác).

Trả lời

9

Tôi đã tìm thấy giải pháp. Các tiêu đề email có chứa các ký tự không phải ascii cần phải được mã hóa theo RFC 2047. Trong Python, điều này có nghĩa là sử dụng email.header.Header thay vì chuỗi thông thường cho nội dung tiêu đề (xem http://docs.python.org/2/library/email.header.html). Cách đúng để viết ví dụ trên là sau đó

from email.mime.text import MIMEText 
from email.header import Header 
body = "Some text" 
subject = "» My Subject"     
msg = MIMEText(body,'plain','utf-8') 
msg['Subject'] = Header(subject,'utf-8') 
text = msg.as_string() 

Chuỗi chủ đề sẽ được mã hóa trong email như

=?utf-8?q?=C2=BB_My_Subject?= 

Thực tế trong python 2.x mã trước đó đã được làm việc cho tôi có thể liên quan đến ứng dụng thư có thể diễn giải tiêu đề được mã hóa sai.

0
  Esta funsion manda un email a un solo correo si alguien quiere la funsión que   mande a varios email tambien la tengo. 
     text = ('Text') 
     mensaje = MIMEText(text,'plain','utf-8') 
     mensaje['From']=(remitente) 
     mensaje['Subject']=('Asunto') 
     mailServer = smtplib.SMTP('xxx.xxx.mx') 
     mailServer.ehlo() 
     mailServer.starttls() 
     mailServer.ehlo() 

     mailServer.sendmail(remitente,destinatario, mensaje.as_string()) 
          mailServer.close() 
+1

Tôi đánh giá cao việc bạn đang cố trợ giúp, nhưng tiếng Anh là bắt buộc đối với Stack Overflow. Vui lòng dịch câu trả lời này sang tiếng Anh. – mhlester