import imaplib import ssl import sys HOST = "127.0.0.1" USER = "barant@barant.com" PASS = "imaptest123" ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE def step(name, fn): try: result = fn() print(f"OK {name}: {result}") return result except Exception as e: print(f"FAIL {name}: {e}") raise m = imaplib.IMAP4_SSL(HOST, 993, ssl_context=ctx) print("connected:", m.welcome) step("LOGIN", lambda: m.login(USER, PASS)) step("CAPABILITY", lambda: m.capability()) step("LIST", lambda: m.list()) typ, data = step("SELECT INBOX", lambda: m.select("INBOX")) print(" EXISTS:", data) typ, data = step("SEARCH ALL", lambda: m.search(None, "ALL")) ids = data[0].split() print(f" {len(ids)} messages") if ids: first = ids[0] typ, data = step("FETCH ENVELOPE", lambda: m.fetch(first, "(ENVELOPE)")) print(" ", data) typ, data = step("FETCH FLAGS UID", lambda: m.fetch(first, "(FLAGS UID)")) print(" ", data) typ, data = step("FETCH BODY[]", lambda: m.fetch(first, "(BODY[])")) print(" body length:", len(data[0][1]) if data and data[0] else 0) step("STORE +FLAGS \\Flagged", lambda: m.store(first, "+FLAGS", "\\Flagged")) typ, data = step("SEARCH FLAGGED", lambda: m.search(None, "FLAGGED")) print(" flagged ids:", data) step("STORE -FLAGS \\Flagged", lambda: m.store(first, "-FLAGS", "\\Flagged")) step("STATUS INBOX", lambda: m.status("INBOX", "(MESSAGES UIDNEXT UIDVALIDITY UNSEEN)")) # APPEND a literal message, then verify it shows up, then clean it up via COPY+EXPUNGE msg = b"From: test@barant.com\r\nTo: barant@barant.com\r\nSubject: IMAP APPEND test\r\n\r\nHello from APPEND.\r\n" typ, data = step("APPEND", lambda: m.append("INBOX", "", None, msg)) print(" ", data) typ, data = step("SEARCH SUBJECT", lambda: m.search(None, 'SUBJECT "APPEND test"')) appended_ids = data[0].split() print(" found:", appended_ids) if appended_ids: step("COPY to Trash", lambda: m.copy(appended_ids[-1], "Trash")) step("STORE +FLAGS \\Deleted", lambda: m.store(appended_ids[-1], "+FLAGS", "\\Deleted")) step("EXPUNGE", lambda: m.expunge()) typ, data = step("SELECT Trash", lambda: m.select("Trash")) print(" Trash EXISTS:", data) step("LOGOUT", lambda: m.logout()) print("ALL DONE")