Python server.sendmail() 返回 {}。电子邮件未发送

use*_*884 4 python email sendmail smtplib

我有一个包含很多行的 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)
Run Code Online (Sandbox Code Playgroud)

这段代码不起作用。登录一切都很好。我注意到的唯一问题是 server.sendmail(fromAddress, toAddress, msg) 返回一个空的 {} 对此可能有什么解决办法?首先问题出在哪里?我已经在终端中运行了 mail() 函数,看起来工作正常。所有文件都托管在这里

aba*_*ert 5

首先,正如文档所说:

\n
\n

如果此方法不引发异常,它将返回一个字典,其中每个被拒绝的收件人都有一个条目。

\n
\n

所以,你回来并不是{}问题;而是问题。这意味着您没有错误。

\n
\n

其次,您发送的消息不是有效的消息。消息必须包含标题,然后是空行,然后是正文。并且标头应至少包含From:To:

\n

图书馆smtplib不会为你做这件事;如示例中所述:

\n
\n

请注意,消息中包含的标头必须包含在输入的消息中;此示例不\xe2\x80\x99 对 RFC 822 标头进行任何处理。特别是, \xe2\x80\x98To\xe2\x80\x99 和 \xe2\x80\x98From\xe2\x80\x99 地址必须显式包含在消息标头中。

\n

...

\n

注意:通常,您需要使用emailpackage\xe2\x80\x99s 功能来构造电子邮件消息,然后可以将其转换为字符串并通过sendmail();发送。请参阅电子邮件:示例

\n
\n

或者,在sendmail文档中:

\n
\n

注意from_addrto_addrs参数用于构造传输代理使用的消息信封。SMTP 不会以任何方式修改邮件标头。

\n
\n

在这种情况下(如示例中所示),只需手动制作消息就足够简单了:

\n
msg = "From: {}\\r\\nTo: {}\\r\\n\\r\\n{}\\r\\n".format(fromAddress, toAddress, em)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

最后,您确实应该server.quit()在函数末尾调用mail。虽然(至少在 CPython 中)server对象将在函数结束后立即销毁,但与 Python 中的许多其他对象不同,SMTP对象在销毁时不会调用close,更不用说quit. 因此,从服务器的角度来看,您突然断开了连接。虽然 RFC 建议服务器在没有 的情况下也可以QUIT正常工作,而且大多数都是这样做的,但它们还建议客户端应始终发送它并等待响应,所以 \xe2\x80\xa6 为什么不这样做呢?

\n