6
我正在查看Python的imaplib的API。Python的imaplib是否允许您设置超时?
从我所知道的,没有办法像smtplib那样设置超时。
这是正确的吗?如果你不希望它阻止,你将如何处理一个无效的主机?
我正在查看Python的imaplib的API。Python的imaplib是否允许您设置超时?
从我所知道的,没有办法像smtplib那样设置超时。
这是正确的吗?如果你不希望它阻止,你将如何处理一个无效的主机?
的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
呼叫阻塞模式中,如在所述方法中的文档指出:
... 插座必须在阻塞模式(它不能有一个超时)。 ...
请删除self.sock.settimeout(无),它让超时不起作用,并始终阻止。 – haosdent