He escrito una secuencia de comandos simple de Python que utiliza MIMEMultipart y SMTPLib para enviar un correo a una serie de destinatarios. El código se parece a esto:

import smtplib
import sys

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

sender='foo@bar.com'
recipients='someguy@bar.com'
subject='A pretty long subject line which looks like this'
mail_server='microsfot_exchange_server_ip'
msg = MIMEMultipart('alternative')
body='Body of the Email'
msg['Subject'] = subject
msg['from'] = sender
msg['to'] = ", ".join(recipients)
s = smtplib.SMTP(mail_server)
s.sendmail(sender, recipients, msg.as_string())
s.quit()

Esto envía un correo con éxito, pero el Asunto como en el cliente de correo de Outlook se ve así:

 A pretty long subject line which looks       like this
5
screwgoth 4 sep. 2014 a las 21:29

2 respuestas

La mejor respuesta

Parece que has accedido al Issue # 1974:

Los encabezados largos de correo electrónico deben estar envueltos. Este proceso se denomina "plegado del encabezado" y se describe en RFC822. Sin embargo, RFC822 parece ser un poco ambiguo acerca de cómo debe realizarse exactamente el plegado del encabezado.

Python en versiones anteriores a 2.7 / 3.1 lo hizo de una manera que causó la emisión que describió con ciertos clientes de correo (usando la pestaña \t como el carácter de continuación).

En el informe de error ha habido una solución alternativa sugerida: Haga que su línea de asunto sea un objeto de encabezado como este:

from email.header import Header

# ...

msg['Subject'] = Header(subject)

Acabo de verificar esto, y de hecho usa espacios en lugar de pestañas como caracteres de continuación, lo que debería resolver su problema.

6
Lukas Graf 4 sep. 2014 a las 18:00

Su línea de asunto tiene más de 78 caracteres y .as_string() la divide. Los primeros caracteres están en la línea de asunto, y los caracteres restantes están en una o varias líneas de continuación.

Cuando Outlook reconstruye la línea de asunto original, lo hace incorrectamente.

Puede intentar evitar esto evitando las líneas de continuación, así:

from StringIO import StringIO
from email.generator import Generator
def my_as_string(msg):
  fp = StringIO()
  g = Generator(fp, mangle_from_=False, maxheaderlen=0)
  g.flatten(msg)
  return fp.getvalue()

...

s.sendmail(sender, recipients, my_as_string(msg))

Referencias:

2
Robᵩ 4 sep. 2014 a las 17:49