2011-11-17 15 views
13

Aquí está una parte de mi código que envía un correo electrónico:MimeText UTF-8 codificar problemas al enviar correo electrónico

servidor = smtplib.SMTP() 
servidor.connect(HOST, PORT) 
servidor.login(user, usenha) 
assunto = str(self.lineEdit.text()) 
para = str(globe_email)    
texto = self.textEdit.toPlainText() 
textos = str(texto) 
corpo = MIMEText(textos.encode('utf-8'), _charset='utf-8') 
corpo['From'] = user 
corpo['To'] = para 
corpo['Subject'] = assunto 
servidor.sendmail(user, [para], corpo.as_string()) 

Todo está bien, excepto la parte del sujeto. Cuando intento enviar una cadena con caracteres especiales (por ejemplo, "en Acción") que plantea este error:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128) 

¿Cómo puedo enviar mensajes de correo electrónico con caracteres especiales en el Tema de MimeText?

Respuesta

29

Parece que, en python3, se necesita un objeto Header para codificar un Subject como "UTF-8":

>>> from email.mime.text import MIMEText 
>>> from email.header import Header 
>>> s = 'ação' 
>>> m = MIMEText(s.encode('utf-8'), 'plain', 'utf-8') 
>>> m['Subject'] = Header(s, 'utf-8') 
>>> m.as_string() 
'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: base64\nSubject: =?utf-8?b?YcOnw6Nv?=\n\nYcOnw6Nv\n' 

Así que el guión original se convertiría en:

servidor = smtplib.SMTP() 
servidor.connect(HOST, PORT) 
servidor.login(user, usenha) 
assunto = str(self.lineEdit.text()) 
para = str(globe_email)    
texto = str(self.textEdit.toPlainText()) 
corpo = MIMEText(texto.encode('utf-8'), 'plain', 'utf-8') 
corpo['From'] = user 
corpo['To'] = para 
corpo['Subject'] = Header(assunto, 'utf-8') 
servidor.sendmail(user, [para], corpo.as_string()) 
+1

funcionó! Casi me daba por vencido ... Encontré algo sobre la opción Encabezado antes de hacer esta pregunta, pero la forma en que lo probé no funcionó, pero ahora funciona muy bien. ¡De verdad gracias! –

+0

Esta solución funcionó perfectamente para mí. – alfredocambera

+1

De acuerdo con los documentos, el '.encode ('utf-8')' no es necesario en su llamada a MIMEText. Siempre que especifique la codificación utf-8, codificará automáticamente unicode: "... Si _text es unicode, se codifica utilizando el output_charset de _charset, de lo contrario se usa tal como está". Probado y parece funcionar para mí. – patricksurry

Cuestiones relacionadas