2014-09-04 49 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