Skip to content

Instantly share code, notes, and snippets.

@BoniLindsley
Created November 13, 2021 12:34
Show Gist options
  • Save BoniLindsley/b5e5a1c92f220d876b5396eee0ffce13 to your computer and use it in GitHub Desktop.
Save BoniLindsley/b5e5a1c92f220d876b5396eee0ffce13 to your computer and use it in GitHub Desktop.
IMAPClient hangs without timeout
#!/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