我有一个python脚本,运行在raspeberry pi上,它监视我的服务器机房,定期给我发一封电子邮件,并制作其他东西。第一次运行脚本时,它会发送通知并正常工作,然后等待一段时间(5分钟或30分钟),这取决于是否触发了警报,所以我编写了一个for循环来等待。当循环结束时,脚本调用发送电子邮件的函数,python返回错误。有人能帮帮我吗?我也在debian 7.7.0机器上测试了它,我也遇到了同样的错误。下面是一个示例脚本和错误。提前谢谢。多姆。
File "/usr/lib/python2.7/smtplib.py", line 361, in getreply
raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed
# Import
from time import sleep
import time
import smtplib
import sys
import string
smtp_server = "10.0.0.4" # mail server address
mail_from = "server@domain.com"
mail_to = "user@gmail.com"
mail_subj = "Server room notify"
server = smtplib.SMTP(smtp_server)
valore = 24 # value for the funtion
def SendAlertEmail(t_value):
log_t = time.strftime("%d/%m/%A %H:%M:%S ")
Text = string.join("Server room notify \n " + str(log_t) + str(t_value))
Body_email = string.join((
"From: %s" % mail_from,
"To: %s" % mail_to,
"Subject: %s" % mail_subj,
"",
Text
), "\r\n")
server.sendmail(mail_from,mail_to,Body_email)
return
SendAlertEmail(valore) # calling from here works fine
for i in range(0,500):
sleep(1)
print(str(i))
SendAlertEmail(valore) # after 500 secs goes in error. Test on debian 7.7.0 python 2.7.3 gcc 4.7.2
发布于 2014-11-19 16:35:43
smtplib在创建SMTP对象时打开TCP连接。当超时可能已经关闭连接时,您可以尝试在不活动500秒后重新使用它。
您应该只保留服务器名称,并在您的使用案例中为每个连接创建一个新的SMTP对象,因为发送邮件之间的延迟太高。
发布于 2014-11-19 17:16:16
正如Serge Ballesta提到的,您应该为发送的每封电子邮件打开和关闭与服务器的连接。
几个月前,我用Python语言编写了一个发送电子邮件的类,您可以在这里找到:https://github.com/kmundnic/Habitus/blob/master/data_sender.py您创建了一个DataSender对象,它处理到服务器的连接。此外,它调用存储帐户和密码的JSON文件,因此您不会将其保存在代码中。
请随意使用它。它是从http://kutuma.blogspot.com/2007/08/sending-emails-via-gmail-with-python.html改编的,正如源代码开头的注释中所提到的那样。
https://stackoverflow.com/questions/27020383
复制相似问题