Django发送电子邮件时中断系统调用

时间:2010-05-21 21:06:10

标签: django

有时,在提交表单(我的网站上几乎任何形式向我发送电子邮件)时,我都会收到以下错误:

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可用)。

有人能引导我朝着正确的方向前进吗?这个错误是什么意思?我该怎么做才能防止这种情况发生。

感谢。

3 个答案:

答案 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