Python 3 smtplib envía con caracteres unicode
-
07-07-2019 - |
Pregunta
Tengo problemas para enviar correos electrónicos con caracteres Unicode usando smtplib en Python 3. Esto falla en 3.1.1, pero funciona en 2.5.4:
import smtplib
from email.mime.text import MIMEText
sender = to = 'ABC@DEF.com'
server = 'smtp.DEF.com'
msg = MIMEText('€10')
msg['Subject'] = 'Hello'
msg['From'] = sender
msg['To'] = to
s = smtplib.SMTP(server)
s.sendmail(sender, [to], msg.as_string())
s.quit()
Intenté un ejemplo de los documentos, que también falló. http://docs.python.org/3.1/library/email-examples. html , el Enviar el contenido de un directorio como un ejemplo de mensaje MIME
¿Alguna sugerencia?
Solución
La clave está en los documentos :
class email.mime.text.MIMEText(_text, _subtype='plain', _charset='us-ascii')
Una subclase de MIMENonMultipart, el La clase MIMEText se usa para crear MIME objetos de texto de tipo principal. _text es la cadena para la carga útil. _subtipo es el tipo menor y el valor predeterminado es llanura. _charset es el conjunto de caracteres del texto y se pasa como parámetro para el MIMENonMultipart constructor; por defecto es us-ascii. No se realizan conjeturas ni codificaciones. en los datos de texto.
Entonces, lo que necesita es claramente, no msg = MIMEText ('& # 8364; 10')
, sino más bien:
msg = MIMEText('€10'.encode('utf-8'), _charset='utf-8')
Aunque no todo está claramente documentado, sendmail necesita una cadena de bytes, no una Unicode (eso es lo que especifica el protocolo SMTP); mire cómo se ve msg.as_string ()
para cada una de las dos formas de construirlo, dado el " sin adivinar o codificar ", su forma todavía tiene ese carácter euro allí (y no forma para que sendmail lo convierta en una cadena de bytes), el mío no (y utf-8 se especifica claramente en todas partes).
Otros consejos
_charset
de MIMEText
está predeterminado en us-ascii
de acuerdo con el documentos . Como & # 8364;
no es de nosotros-ascii set, no funciona.
ejemplo en los documentos que has probado indica claramente:
Para este ejemplo, suponga que el archivo de texto contiene solo caracteres ASCII.
Puede usar . método get_charset
en su mensaje para investigar el juego de caracteres, por cierto también hay .set_charset
.
Gus Mueller tuvo un problema similar: http://bugs.python.org/issue4403