我有一个有很多行的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
答案 0 :(得分:3)
首先,正如the docs所说:
如果此方法不引发异常,则返回一个字典,每个收件人都有一个条目被拒绝。
所以,你回来{}
的事实不是问题;这意味着你没有错误。
其次,您发送的内容不是有效消息。消息必须包含标题,然后是空行,然后是正文。标头应至少包含From:
和To:
。
smtplib
库不会为您执行此操作;正如the example中所述:
请注意,邮件中包含的标题必须包含在输入的邮件中;此示例不执行RFC 822标头的任何处理。特别是,“收件人”和“发件人”地址必须明确包含在邮件标题中。
...
注意:一般情况下,您需要使用
sendmail()
发送;见email: Examples。
或者,在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
的情况下正常工作,并且大多数都这样做,但他们还建议客户端始终发送它并等待响应,所以......为什么不这样做?