2014-06-26 30 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

相關問題