有时,在提交表单(我的网站上几乎任何形式向我发送电子邮件)时,我都会收到以下错误:
File "/usr/lib/python2.5/smtplib.py", line 603, in starttls
(resp, reply) = self.docmd("STARTTLS")
File "/usr/lib/python2.5/smtplib.py", line 378, in docmd
return self.getreply()
File "/usr/lib/python2.5/smtplib.py", line 352, in getreply
line = self.file.readline()
File "/usr/lib/python2.5/socket.py", line 381, in readline
data = self._sock.recv(self._rbufsize)
error: (4, 'Interrupted system call')
我的代码是通过Gmail发送电子邮件。我也使用django联系表格做同样的事情。
问题并非总能发生。看起来很随意。今天有一点它很糟糕,每次我提交表格时都会显示错误。
重新启动apache修复了一次提交的问题,然后再次执行。
我已经检查了RAM并且有足够的可用空间(大约350MB可用)。
有人能引导我朝着正确的方向前进吗?这个错误是什么意思?我该怎么做才能防止这种情况发生。
感谢。
答案 0 :(得分:0)
我会说它与smtp服务器的网络连接错误有关。 看起来它在尝试从服务器读取回复时被中断了吗?
答案 1 :(得分:0)
答案 2 :(得分:0)
在读取任何数据之前,smtplib使用的recv调用被信号中断。根据read(2)联机帮助页,POSIX允许在读取某些数据后中断的read()返回-1(将errno设置为EINTR)或返回已读取的字节数。
在Python中,EINTR引发IOError:“[Errno 4]中断系统调用”(EINTR == 4)。
如何正确处理EINTR的一个例子是subprocess.communicate()。在这里看一篇优秀的帖子: http://znasibov.info/blog/post/inside-python-subprocess-communication.html
但是,在Python 2.5中,socket.readline()无法正确处理EINTR。看到: http://bugs.python.org/issue1628205:socket.readline()接口无法正确处理EINTR