2014-11-14 61 views
0

我有一個file.txt文件,它有很多行。我希望隨機選擇任意一行並通過電子郵件發送。這是三次循環。Python server.sendmail()返回{}。電子郵件沒有發送

import smtplib,datetime,random 

def mail(em): 
    #print "yo" 
    fromAddress = "[email protected]" 
    toAddress = "[email protected]" 
    subject = "WOW " + str(datetime.datetime.now()) 
    #print subject 
    msg = em 
    server=smtplib.SMTP("smtp.gmail.com", 587) 
    server.starttls() 
    password = "mypassword" 
    server.login(fromAddress, password) 
    server.sendmail(fromAddress, toAddress, msg) 
    #print server.sendmail(fromAddress, toAddress, msg) 


for i in range(0,3): 
    em=str(random.choice(list(open('file.txt')))) 
    mail(em) 

此代碼不起作用。登錄和一切都很好。我注意到的唯一問題是server.sendmail(fromAddress,toAddress,msg)返回一個空的{} 可能的解決方法是什麼?第一個問題是什麼? 我已經在終端中運行mail()函數,似乎工作正常。 所有文件都託管here

+2

你爲什麼發佈你的密碼? – Hackaholic 2014-11-14 22:56:05

+0

它被_supposed_返回一個空的'{}'。請參閱[文檔](https://docs.python.org/2/library/smtplib.html#smtplib.SMTP.sendmail):「如果此方法不引發異常,它將返回一個字典,其中一個條目用於每個收件人都被拒絕了。「所以,這意味着你沒有錯誤。 – abarnert 2014-11-14 22:57:53

+0

@Geez!我忘了在腳本中改變它。無論如何,它不是一個重要的帳戶,因此 – user248884 2014-11-14 22:58:25

回答

1

首先,作爲the docs說:

如果此方法不會引發異常,它返回一個字典,同時,對於被拒絕每個接收者一個條目。

所以,事實上,你回來{}是不是一個問題;這意味着你沒有錯誤。


其次,您發送的內容不是有效的消息。消息必須包含標題,然後是空白行,然後是正文。標題至少應包含From:To:

smtplib庫不會爲你做這件事;如the example中所解釋:

請注意,消息中包含的標頭必須包含在消息中,如輸入;此示例不執行任何RFC 822標題的處理。特別是,「收件人」和「發件人」地址必須明確包含在郵件標題中。

...

注意:一般情況下,你將要使用的email包的特徵來構建的電子郵件,然後你就可以轉換爲字符串,並通過sendmail()發送;見email: Examples

或者,在sendmail文檔:

:本from_addrto_addrs參數被用於構建由傳輸代理使用的消息信封。 SMTP不以任何方式修改郵件標題。

在這種情況下(如在本例中),這是很簡單,只是手工工藝的消息:

msg = "From: {}\r\nTo: {}\r\n\r\n{}\r\n".format(fromAddress, toAddress, em) 

最後,你真的應該在mail函數的末尾呼籲server.quit() 。雖然(至少在CPython中)server對象只要函數結束就會被銷燬,與Python中的許多其他對象不同,SMTP對象在銷燬時不會調用close,更不用說quit。所以,從服務器的角度來看,你突然斷開連接。雖然RFC建議服務器應該工作得很好,沒有QUIT,並且大多數人都這樣做,但他們也建議客戶端應該總是發送它並等待響應,所以......爲什麼不這樣做呢?

+0

這工作只是完美!謝謝! – user248884 2014-11-14 23:17:46