imaplib SSL连接在关闭后处于CLOSE_WAIT状态

2 投票
1 回答
1070 浏览
提问于 2025-04-16 13:24

我有一段Python代码,它通过IMAP4_SSL连接到IMAP服务器,一切运行得很好,直到它尝试用以下代码关闭连接:

def logout(self):
    "Close the mailbox and logout and set the connection to None"
    try:
        self.connection.close()
        self.connection.logout()
    except e:
        pass
    self.connection = None

但是这会让连接处于CLOSE_WAIT状态:

 tcp       38      0 1.2.3.4:55809        5.6.7.8:993 CLOSE_WAIT  18983/python2.6

这种状态会持续很长时间。我的Python程序是一个长时间运行的后台进程,它会定期进行IMAP检查,所以这些连接会随着时间的推移而积累。你们觉得这可能是为什么呢?我哪里做错了?

1 个回答

1

当本地程序没有关闭套接字时,它会处于CLOSE_WAIT状态。

查看imaplib的源代码,发现唯一调用self.sock.close()的地方是在shutdown()函数里。

我猜你需要调用self.connection.shutdown()

更新:正如Bruno所提到的,logout()会调用shutdown()。不过,示例代码的结构是,如果close()出现异常,那么logout()就会被悄悄跳过……这样一来,shutdown()就不会被调用。我在想这是不是发生的情况。

撰写回答