From 77c0255f54e427afd0f758519263d91654227a1b Mon Sep 17 00:00:00 2001 From: Sean Whalen Date: Thu, 29 Mar 2018 14:05:51 -0400 Subject: [PATCH] Better IMAP error handling --- parsedmarc/__init__.py | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/parsedmarc/__init__.py b/parsedmarc/__init__.py index 9f5fb31f..0154b6e6 100644 --- a/parsedmarc/__init__.py +++ b/parsedmarc/__init__.py @@ -1339,15 +1339,36 @@ def watch_inbox(host, username, password, callback, reports_folder="INBOX", ns = nameservers dt = dns_timeout server = imapclient.IMAPClient(host) - server.login(username, password) - server.select_folder(rf) - idle_start_time = time.monotonic() - server.idle() + try: + server.login(username, password) + server.select_folder(rf) + idle_start_time = time.monotonic() + server.idle() + + except imapclient.exceptions.IMAPClientError as error: + error = error.__str__().lstrip("b'").rstrip("'").rstrip(".") + raise IMAPError(error) + except socket.gaierror: + raise IMAPError("DNS resolution failed") + except ConnectionRefusedError: + raise IMAPError("Connection refused") + except ConnectionResetError: + raise IMAPError("Connection reset") + except ConnectionAbortedError: + raise IMAPError("Connection aborted") + except TimeoutError: + raise IMAPError("Connection timed out") + except ssl.SSLError as error: + raise IMAPError("SSL error: {0}".format(error.__str__())) + except ssl.CertificateError as error: + raise IMAPError("Certificate error: {0}".format(error.__str__())) + except BrokenPipeError: + raise IMAPError("Broken pipe") while True: try: - # Refresh the IDLE session every 10 minutes to keep connected + # Refresh the IDLE session every 10 minutes to stay connected if time.monotonic() - idle_start_time > 10 * 60: server.idle_done() server.idle() @@ -1383,6 +1404,8 @@ def watch_inbox(host, username, password, callback, reports_folder="INBOX", raise IMAPError("SSL error: {0}".format(error.__str__())) except ssl.CertificateError as error: raise IMAPError("Certificate error: {0}".format(error.__str__())) + except BrokenPipeError: + raise IMAPError("Broken pipe") except KeyboardInterrupt: break