Created
November 13, 2021 12:34
-
-
Save BoniLindsley/b5e5a1c92f220d876b5396eee0ffce13 to your computer and use it in GitHub Desktop.
IMAPClient hangs without timeout
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
# Standard libraries. | |
import logging | |
import socket | |
import sys | |
import threading | |
# External libraries. | |
import imapclient # type: ignore[import] | |
_logger = logging.getLogger(__name__) | |
HOST = "imap.example.com" | |
USERNAME = "user@example.com" | |
PASSWORD = "Tr0ub4dor&3" | |
FOLDER = "INBOX" | |
TIMEOUT_SECONDS = None | |
def run() -> int: | |
_logger.info("Connecting to %s.", HOST) | |
try: | |
server = imapclient.IMAPClient(HOST, timeout=TIMEOUT_SECONDS) | |
except socket.gaierror as error: | |
_logger.error(error) | |
return 1 | |
with server as server: | |
_logger.info("Logging in as %s.", USERNAME) | |
server.login(USERNAME, PASSWORD) | |
print("Waiting for SIGINT before selecing folder.") | |
try: | |
lock = threading.Lock() | |
# Deliberately double lock to wait indefinitely. | |
with lock, lock: | |
pass | |
except KeyboardInterrupt: | |
_logger.info("SIGINT received.") | |
if TIMEOUT_SECONDS is None: | |
_logger.info("No timeout set in TIMEOUT_SECONDS.") | |
else: | |
_logger.info( | |
"Time out is set to %s seconds.", TIMEOUT_SECONDS | |
) | |
_logger.info("Selecting folder %s.", FOLDER) | |
try: | |
server.select_folder("INBOX", readonly=True) | |
# TODO(Python version 3.10): Catch TimeoutError instead. | |
except socket.error: | |
_logger.error("Timed out selecting folder.") | |
return 0 | |
def main() -> int: | |
formatter = logging.Formatter( | |
"[%(asctime)s] [%(levelno)03s] %(name)s: %(message)s", | |
) | |
handler = logging.StreamHandler(sys.stderr) | |
handler.setFormatter(formatter) | |
_logger.addHandler(handler) | |
_logger.setLevel(logging.DEBUG) | |
logger = logging.getLogger("imapclient.imapclient") | |
logger.addHandler(handler) | |
logger.setLevel(logging.DEBUG) | |
try: | |
return run() | |
except KeyboardInterrupt: | |
_logger.info("SIGINT received. Exiting.") | |
return 1 | |
if __name__ == "__main__": | |
sys.exit(main()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment