Python的imaplib是否允许您设置超时?

oko*_*oko 9 python imaplib

我正在寻找Python的imaplib的API .

据我所知,没有办法像smtplib一样设置超时.

那是对的吗?如果您不希望它阻止,您将如何处理无效的主机?

fam*_*kin 17

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

import socket
import imaplib
socket.setdefaulttimeout(10)
imap = imaplib.IMAP4('test.com', 666)
Run Code Online (Sandbox Code Playgroud)

或者您也可以imaplib.IMAP4使用imaplib和文档中的一些知识来覆盖该类,从而提供更好的控制:

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')
Run Code Online (Sandbox Code Playgroud)

请注意,在创建连接之后,我们应该将套接字超时设置None为将其置于阻塞模式以进行后续socket.makefile调用,如方法文档中所述:

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