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?

¿Fue útil?

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

El parámetro

_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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top