2014-06-26 23 views

回答

12

imaplib模块不提供一种方法来设置超时时间,但你可以通过socket.setdefaulttimeout设置新的套接字连接的默认超时:

import socket 
import imaplib 
socket.setdefaulttimeout(10) 
imap = imaplib.IMAP4('test.com', 666) 

或者你也可以去与重写imaplib.IMAP4类从imaplib source和文档的一些知识,它提供了更好的控制:

import imaplib 
import socket 

class IMAP(imaplib.IMAP4): 
    def __init__(self, host='', port=imaplib.IMAP4_PORT, timeout=None): 
     self.timeout = timeout 
     # no super(), it's an old-style class 
     imaplib.IMAP4.__init__(self, host, port) 

    def open(self, host='', port=imaplib.IMAP4_PORT): 
     self.host = host 
     self.port = port 
     self.sock = socket.create_connection((host, port), timeout=self.timeout) 
     # clear timeout for socket.makefile, needs blocking mode 
     self.sock.settimeout(None) 
     self.file = self.sock.makefile('rb') 

注意,创建连接后,我们应该设置套接字超时回到None到g等它用于后续socket.makefile呼叫阻塞模式中,如在所述方法中的文档指出:

... 插座必须在阻塞模式(它不能有一个超时)。 ...

+0

请删除self.sock.settimeout(无),它让超时不起作用,并始终阻止。 – haosdent

相关问题