繁体   English   中英

Python邮件在Outlook主题行中放置了无法计算的空间

[英]Python mail puts unaccounted space in Outlook Subject line

我编写了一个简单的Python脚本,它使用MIMEMultipart和SMTPLib将邮件发送给收件人数组。 代码看起来像这样:

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

这会成功发送邮件,但Outlook邮件客户端中的主题看起来像这样:

 A pretty long subject line which looks       like this

看来你已经遇到了问题#1974

应该包装长电子邮件标题。 此过程称为“标题折叠”,在RFC822描述。 但是,RFC822似乎对于应该如何进行标头折叠有点不明确。

早于2.7 / 3.1版本的Python碰巧以某种方式执行此操作,导致您使用某些邮件客户端描述的发布(使用tab \\t作为延续字符)。

在错误报告中有一个建议的解决方法 :使主题行成为这样的标题对象:

from email.header import Header

# ...

msg['Subject'] = Header(subject)

我刚刚验证了这一点,它确实使用空格而不是制表符作为延续字符,这应该可以解决您的问题。

您的主题行超过78个字符,并且被.as_string()分解。 前几个字符在主题行上,其余字符在一个或多个连续行上。

当Outlook重建原始主题行时,它会错误地执行。

你可以通过避免延续线来避免这种情况,如下所示:

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

参考文献:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM