2010-05-21 3 views
0

을 보낼 때 : 내 코드를 통해 이메일을 보내는장고 중단 된 시스템 호출, 때로는 이메일

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 contact-form을 사용하고있다.

문제가 항상 발생하는 것은 아닙니다. 매우 무작위로 보인다. 한순간에 오늘은 양식을 제출할 때마다 오류를 표시하는 것이 좋지 않습니다.

아파치를 다시 시작하면 한 제출의 문제가 해결 된 다음 다시 시도됩니다.

RAM을 점검 했으므로 사용할 수있는 공간이 충분합니다 (약 350MB).

나를 올바른 방향으로 인도 할 수 있습니까? 이 오류는 무엇을 의미합니까? 이것을 막기 위해 무엇을 할 수 있습니까?

감사합니다.

답변

0

나는 그것이 smtp 서버에 대한 잘못된 네트워크 연결과 관련이 있다고 말할 것이다. 서버에서 답장을 읽으려고 할 때 방해를받는 것처럼 보입니까?

+0

오류가 발생하지 않도록 할 수있는 방법이 있습니까? try와 같은 것 : 실패한 경우 다시 시도하십시오. 3 회 시도한 후 이메일 전송을 건너 뛰시겠습니까? 그렇다면 어떤 예외가 있습니까? – mhost

0

해결 방법으로 소켓 timeout을 늘려보십시오.

이 문제를 해결하려면 GMail의 서버에 안정적으로 연결되어 있지 않을 수 있으며이를 해결할 방법이 없을 수도 있습니다.

호출이 데이터를 다시 받기 전에 신호가 던져진 것처럼 보입니다.

0

smtplib에서 사용하는 recv 호출은 데이터를 읽기 전에 신호로 중단됩니다. read (2) 맨 페이지에 따라 POSIX는 일부 데이터를 읽은 후 -1을 반환하고 (errno를 EINTR로 설정) 중단 된 read()를 허용하거나 이미 읽은 바이트 수를 반환합니다.

파이썬에서 EINTR은 IOError : "[Errno 4] Interrupted system call"(EINTR == 4)을 발생시킵니다.

EINTR이 올바르게 처리되는 방법의 예는 subprocess.communicate()입니다. 여기에 훌륭한 글을 참고하십시오 : http://znasibov.info/blog/post/inside-python-subprocess-communication.html

그러나 파이썬 2.5에서는 socket.readline()이 EINTR를 제대로 처리하지 못합니다. 참조 : http://bugs.python.org/issue1628205 : socket.readline() 인터페이스가 EINTR을 제대로 처리하지 못합니다.