我编写了一个简单的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 Mail客户端中的主题看起来像这样:
A pretty long subject line which looks like this
答案 0 :(得分:6)
好像你已经点击了Issue #1974:
应包装长电子邮件标头。此过程称为“标题折叠”,并在RFC822
中进行了描述。但是,RFC822似乎对于应该如何进行标题折叠有点不明确。
早于2.7
/ 3.1
的版本中的Python碰巧以某种方式执行此操作,导致您使用某些邮件客户端描述的发布(使用选项卡\t
作为延续字符)。
在错误报告中有一个workaround建议:将主题行设为这样的标题对象:
from email.header import Header
# ...
msg['Subject'] = Header(subject)
我刚验证了这一点,它确实使用空格而不是制表符作为延续字符,这可以解决您的问题。
答案 1 :(得分:2)
您的主题行超过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))
参考文献: