From 2d7b3afaca97a3e6a115c077586d0a9fb9daf8b2 Mon Sep 17 00:00:00 2001 From: Mehdi ABAAKOUK Date: Tue, 24 May 2016 12:22:30 +0200 Subject: [PATCH] Fix imap connection lost (#380) Nothing in imap mail backend reinit the imap connection when this one is lost, and then the backend always output "socket.error:..." This change fixes that by cleanup the connection object when connection is lost so get_connection() will recreate a new one. This also remove the unless utils.internet() checks already done by Mail().run() --- i3pystatus/mail/imap.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/i3pystatus/mail/imap.py b/i3pystatus/mail/imap.py index 1ac0c5c..58dc252 100644 --- a/i3pystatus/mail/imap.py +++ b/i3pystatus/mail/imap.py @@ -1,8 +1,7 @@ -import sys import imaplib +import socket from i3pystatus.mail import Backend -from i3pystatus.core.util import internet class IMAP(Backend): @@ -33,20 +32,30 @@ class IMAP(Backend): self.imap_class = imaplib.IMAP4_SSL def get_connection(self): + if self.connection: + try: + self.connection.select(self.mailbox) + except socket.error: + # NOTE(sileht): retry just once if the connection have been + # broken to ensure this is not a sporadic connection lost. + # Like wifi reconnect, sleep wake up + try: + self.connection.logout() + except socket.error: + pass + self.connection = None + if not self.connection: self.connection = self.imap_class(self.host, self.port) self.connection.login(self.username, self.password) self.connection.select(self.mailbox) - self.connection.select(self.mailbox) - return self.connection @property def unread(self): - if internet(): - conn = self.get_connection() - self.last = len(conn.search(None, "UnSeen")[1][0].split()) + conn = self.get_connection() + self.last = len(conn.search(None, "UnSeen")[1][0].split()) return self.last