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

时间:2014-11-14 22:54:59

标签: 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)

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

1 个答案:

答案 0 :(得分:3)

首先,正如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的情况下正常工作,并且大多数都这样做,但他们还建议客户端始终发送它并等待响应,所以......为什么不这样做?