我在看python的apiimaplib
据我所知,无法像使用smtplib那样设置超时。
对吗?如果不想阻止无效主机,您将如何处理它?

最佳答案

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

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

或者,您也可以用一些来自imaplib.IMAP4和docs的知识覆盖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')

注意,在创建连接之后,我们应该将socket timeout设置回None以使其在随后的socket.makefile调用中处于阻塞模式,如方法文档中所述:

套接字必须处于阻塞模式(不能超时)。…

关于python - Python的imaplib是否允许您设置超时?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24422724/

10-10 22:33