2014-09-04 45 views
5

我已经编写了一个简单的Python脚本,它使用MIMEMultipart和SMTPLib向收件人数组发送邮件。 代码看起来是这样的:Python邮件在Outlook中放置未占用空间主题行

import smtplib 
import sys 

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

sender='[email protected]' 
recipients='[email protected]' 
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 
+0

如果您可以包含由Python创建的消息(msg.as_string()'的输出)和客户端接收的电子邮件(Outlook))的相关头文件将很有帮助。 – 2014-09-04 17:34:31

+0

另请参见:您正在使用哪种Python版本? – 2014-09-04 17:48:21

+0

这里是什么样子的标题: '主题:一个相当长的主题行看起来 \t像this' 我使用Python 2.7 – screwgoth 2014-09-04 18:08:29

回答

6

看来你已经击中了Issue #1974

长的电子邮件标题应该被打包。这个过程被称为“标题折叠”,并在RFC822中描述。但是,RFC822似乎对于如何进行标题折页应该有点模糊。

的Python早于2.7/3.1事做,在导致已发行你与某些邮件客户端(使用标签\t作为延续字符)描述的方式的版本。

在bug报告中出现了workaround建议:让你的主题行头对象是这样的:

from email.header import Header 

# ... 

msg['Subject'] = Header(subject) 

我只是验证了这一点,它确实用空格代替制表符作为延续字符,这应该可以解决你的问题。

+2

+1。除此之外:RFC2822(取代RFC822)明确描述了标题折叠和展开。 – 2014-09-04 17:59:37

+0

非常感谢@ lukas-graf。 '标题'解决了我的问题 – screwgoth 2014-09-04 18:43:40

+0

另一种可能的解决方法是RFC2047-对标题进行编码。 – tripleee 2014-09-05 03:36:48

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

参考文献:

+0

screwgoth:我会留下我的答案了的情况下,它的价值后人。但是,你应该更喜欢卢卡斯的答案。 – 2014-09-04 18:00:34

+0

是的。你的解决方案可能也会起作用,但我认为这是一个圆满的方式。尽管如此,我很欣赏将我引入'Generator'类。 – screwgoth 2014-09-04 18:45:10