2013-04-18 12 views
5

Sto usando MIMEText per creare una e-mail da zero in Python 3.2 e ho problemi a creare messaggi con caratteri non ascii nell'oggetto.Codifica delle intestazioni in MIMEText

Per esempio

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

L'ultima riga mi dà l'errore

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

Come faccio a dire MIMEText che il soggetto non è ASCII? subject.encode('utf-8') non aiuta affatto e comunque ho visto persone che usano stringhe unicode senza problemi in altre risposte (vedi ad esempio Python - How to send utf-8 e-mail?)

Modifica: Vorrei aggiungere che lo stesso codice non dà qualsiasi errore in Python 2.7 (pensato che non significa che il risultato sia corretto).

risposta

9

Ho trovato la soluzione. Le intestazioni di e-mail contenenti caratteri non ascii devono essere codificate come da RFC 2047. In Python ciò significa utilizzare email.header.Header anziché una normale stringa per il contenuto dell'intestazione (vedere http://docs.python.org/2/library/email.header.html). Il modo giusto di scrivere l'esempio di cui sopra è quindi

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

La stringa argomento sarà codificato nel email

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

Il fatto che il in python 2.x codice precedente stava lavorando per me è probabilmente correlato al client di posta in grado di interpretare l'intestazione erroneamente codificata.

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

Apprezzo che stiate cercando di aiutare, ma l'inglese è richiesto su Stack Overflow. Si prega di tradurre questa risposta in inglese. – mhlester

Problemi correlati