[英]Python server.sendmail() returns {}. Email not sent
我有一個file.txt文件,其中有很多行。 我希望任意選擇一行並通過電子郵件發送。 這是三次循環。
import smtplib,datetime,random
def mail(em):
#print "yo"
fromAddress = "atadmorecouth@gmail.com"
toAddress = "atadmorecouth@gmail.com"
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()函數,這似乎工作正常。 所有文件都托管在這里
首先,正如文檔所說:
如果此方法沒有引發異常,它將返回一個字典,其中每個拒絕的接收者都有一個條目。
因此,您返回{}
的事實不是問題; 這意味着您沒有任何錯誤。
其次,您發送的不是有效消息。 一條消息必須包含標題,然后是空白行,然后是正文。 標頭應至少包含From:
和To:
請注意,要包含在消息中的標題必須在輸入時包含在消息中。 本示例不對RFC 822標頭進行任何處理。 特別是,“ To”和“ From”地址必須明確包含在消息頭中。
...
注意 :通常,您將要使用
sendmail()
發送; 請參閱電子郵件:示例 。
或者,在sendmail
文檔中:
注意 :
from_addr
和to_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
情況下也可以正常工作,但大多數都可以,但他們也建議客戶端應始終發送它並等待響應,所以……為什么不這樣做呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.