36 lines
1.4 KiB
Markdown
36 lines
1.4 KiB
Markdown
# IMAP Verification Code Extraction Pattern
|
|
|
|
## Key Lessons
|
|
- `mail.search(None, "ALL")` HANGS on large mailboxes (5000+ emails)
|
|
- **Fix**: Use `mail.search(None, '(UNSEEN FROM "x.ai")')` with fallback to `mail.search(None, "UNSEEN")`
|
|
- **Socket timeout**: Always set `mail = imaplib.IMAP4_SSL(host, port, timeout=30)` and `mail.socket().settimeout(30)`
|
|
- Wrap each search in try/except
|
|
|
|
## Working Code Snippet
|
|
```python
|
|
def get_verification_code(email_addr, password, timeout=180):
|
|
import socket
|
|
mail = imaplib.IMAP4_SSL(IMAP_HOST, IMAP_PORT, timeout=30)
|
|
mail.socket().settimeout(30)
|
|
mail.login(email_addr, password)
|
|
mail.select("INBOX")
|
|
|
|
start = time.time()
|
|
while time.time() - start < timeout:
|
|
try:
|
|
typ, data = mail.search(None, '(UNSEEN FROM "x.ai")')
|
|
if typ != "OK":
|
|
typ, data = mail.search(None, "UNSEEN")
|
|
if typ == "OK" and data[0]:
|
|
ids = data[0].split()
|
|
for mid in reversed(ids):
|
|
# fetch and parse message
|
|
...
|
|
if "x.ai" in sender.lower():
|
|
code_match = re.search(r'\b([A-Z0-9]{3}-[A-Z0-9]{3})\b', body)
|
|
if code_match:
|
|
return code_match.group(1)
|
|
except Exception as e:
|
|
print(f"IMAP search error: {e}")
|
|
time.sleep(5)
|
|
``` |