簡體   English   中英

Python server.sendmail()返回{}。 電子郵件未發送

[英]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:

smtplib庫不會為您執行此操作; 示例所述

請注意,要包含在消息中的標題必須在輸入時包含在消息中。 本示例不對RFC 822標頭進行任何處理。 特別是,“ To”和“ From”地址必須明確包含在消息頭中。

...

注意 :通常,您將要使用email包的功能來構造電子郵件,然后可以將其轉換為字符串並通過sendmail()發送; 請參閱電子郵件:示例

或者,在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情況下也可以正常工作,但大多數都可以,但他們也建議客戶端應始終發送它並等待響應,所以……為什么不這樣做呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM