autoreg-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# IMAP Quoted-Printable JWT Token Extraction
|
||||
|
||||
## Problem
|
||||
Verification emails often contain JWT tokens in URLs that are split across multiple lines due to quoted-printable encoding. The `=` at end of line is a soft break.
|
||||
|
||||
## Example
|
||||
|
||||
Raw email content:
|
||||
```
|
||||
token=[REDACTED]
|
||||
eyJlbWFpbCI6Im...\r\n
|
||||
3ODQ3NDM1Mzd9.qiOoGUNZZsPse1jQnZ8JHvUrb6xKX5KbPatfwvXUPGA&callbackURL=3D%2F
|
||||
```
|
||||
|
||||
## Extraction Code
|
||||
|
||||
```python
|
||||
import imaplib, re
|
||||
|
||||
M = imaplib.IMAP4_SSL('imap.gmail.com')
|
||||
M.login(email, app_password)
|
||||
M.select('INBOX')
|
||||
typ, data = M.search(None, 'FROM', 'sender')
|
||||
ids = data[0].split() if data[0] else []
|
||||
typ, msg = M.fetch(ids[-1], '(RFC822)')
|
||||
raw = msg[0][1]
|
||||
|
||||
# Find token= in raw bytes
|
||||
idx = raw.find(b'token=')
|
||||
chunk = raw[idx+6:idx+250] # skip 'token='
|
||||
|
||||
# Remove soft breaks (=\r\n)
|
||||
result = []
|
||||
i = 0
|
||||
while i < len(chunk):
|
||||
if chunk[i:i+1] == b'&':
|
||||
break
|
||||
if i+2 < len(chunk) and chunk[i:i+3] == b'=\r\n':
|
||||
i += 3 # skip soft break
|
||||
elif i+1 < len(chunk) and chunk[i:i+1] == b'=' and chunk[i+1:i+2] == b'\r':
|
||||
i += 3
|
||||
else:
|
||||
result.append(chr(chunk[i]))
|
||||
i += 1
|
||||
|
||||
token = ''.join(result)
|
||||
# Remove 3D prefix if present (= in quoted-printable)
|
||||
if token.startswith('3D'):
|
||||
token = [REDACTED]]
|
||||
```
|
||||
|
||||
## Important
|
||||
- Python's `repr()` truncates long strings with `...` — the actual string is complete
|
||||
- The `3D` prefix is the quoted-printable encoding of `=`
|
||||
- Always work with raw bytes, not decoded text, to avoid encoding issues
|
||||
- Use `b'...'` byte strings for searching in raw email content
|
||||
Reference in New Issue
Block a user