2013-04-18 31 views
5

Python 3.2'de sıfırdan bir e-posta oluşturmak için MIMEText kullanıyorum ve konuyla ilgili olmayan karakterli karakterler oluşturma konusunda sorun yaşıyorum. ÖrneğinMIMEText'de başlıkları kodlama

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() 

son satırı için

bana

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

nasıl konu ASCII olmadığını MIMEText anlarım hata veriyor? subject.encode('utf-8') hiçbir şekilde yardımcı olmuyor, ve yine de diğer yanıtlarda sorun olmadan unicode dizeleri kullanan insanlar gördüm (örneğin, Python - How to send utf-8 e-mail?)

Düzenleme: Aynı kodu vermediğini eklemek istiyorum Python 2.7'deki herhangi bir hata (sonucun doğru olduğu anlamına gelmez).

cevap

9

Çözümü buldum. Ascii olmayan karakterler içeren e-posta başlıklarının RFC 2047'a göre kodlanması gerekir. Python'da, bu, üstbilgi içeriği (bkz. http://docs.python.org/2/library/email.header.html) için normal bir dize yerine email.header.Header kullanılması anlamına gelir. yukarıdaki örneği yazmak için doğru yolu sonra

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() 

konu dize

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

gerçeği olarak e-posta kodlanmış olacak olan piton 2.x önceki kod benim için çalışıyordu muhtemelen yanlış kodlanmış üstbilgiyi yorumlayabilen posta istemcisiyle ilgilidir.

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

Yardım etmeye çalıştığınız için teşekkür ederim, ancak Yığın Taşması'nda İngilizce gerekiyor. Lütfen bu cevabı İngilizce'ye çeviriniz. – mhlester