autoreg-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
112
skills/email-infrastructure/references/gmail-imap-smtp-cheat.md
Normal file
112
skills/email-infrastructure/references/gmail-imap-smtp-cheat.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# Gmail IMAP/SMTP Full Code Templates
|
||||
|
||||
## IMAP — Full Fetch + Parse
|
||||
|
||||
```python
|
||||
import imaplib, email
|
||||
from email.header import decode_header
|
||||
from email.utils import parsedate_to_datetime
|
||||
|
||||
def fetch_emails(user, app_pass, folder='INBOX', limit=10, search_criteria='ALL'):
|
||||
"""Fetch last N emails from Gmail IMAP."""
|
||||
m = imaplib.IMAP4_SSL('imap.gmail.com', 993)
|
||||
m.login(user, app_pass)
|
||||
m.select(folder)
|
||||
_, data = m.search(None, search_criteria)
|
||||
ids = data[0].split()[-limit:]
|
||||
|
||||
results = []
|
||||
for mid in reversed(ids):
|
||||
_, msg_data = m.fetch(mid, '(RFC822)')
|
||||
raw = email.message_from_bytes(msg_data[0][1])
|
||||
|
||||
# Subject decode
|
||||
subj_parts = decode_header(raw['Subject'])
|
||||
subject = ''
|
||||
for part, charset in subj_parts:
|
||||
if isinstance(part, bytes):
|
||||
subject += part.decode(charset or 'utf-8', errors='replace')
|
||||
else:
|
||||
subject += str(part)
|
||||
|
||||
# Body (text/plain first, fallback text/html)
|
||||
body = ''
|
||||
if raw.is_multipart():
|
||||
for part in raw.walk():
|
||||
ct = part.get_content_type()
|
||||
if ct == 'text/plain':
|
||||
body = part.get_payload(decode=True).decode('utf-8', errors='replace')
|
||||
break
|
||||
else:
|
||||
body = raw.get_payload(decode=True).decode('utf-8', errors='replace')
|
||||
|
||||
results.append({
|
||||
'id': int(mid),
|
||||
'from': raw['From'],
|
||||
'to': raw['To'],
|
||||
'subject': subject,
|
||||
'date': raw['Date'],
|
||||
'body': body[:500],
|
||||
})
|
||||
|
||||
m.logout()
|
||||
return results
|
||||
```
|
||||
|
||||
## SMTP — Full Send
|
||||
|
||||
```python
|
||||
import smtplib
|
||||
from email.mime.text import MIMEText
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
|
||||
def send_email(user, app_pass, to, subject, body, html=False):
|
||||
"""Send email via Gmail SMTP."""
|
||||
msg = MIMEMultipart() if html else MIMEText(body)
|
||||
if html:
|
||||
msg.attach(MIMEText(body, 'html'))
|
||||
else:
|
||||
msg = MIMEText(body)
|
||||
|
||||
msg['Subject'] = subject
|
||||
msg['From'] = user
|
||||
msg['To'] = to
|
||||
|
||||
with smtplib.SMTP_SSL('smtp.gmail.com', 465, timeout=10) as s:
|
||||
s.login(user, app_pass)
|
||||
s.send_message(msg)
|
||||
```
|
||||
|
||||
## Sub-address filter pattern
|
||||
|
||||
```python
|
||||
# Fetch only emails sent to specific sub-address
|
||||
m.search(None, 'TO', '[REDACTED-NAME]+bot@gmail.com')
|
||||
```
|
||||
|
||||
## Gmail IMAP folder list
|
||||
|
||||
```python
|
||||
m = imaplib.IMAP4_SSL('imap.gmail.com')
|
||||
m.login(user, app_pass)
|
||||
_, folders = m.list()
|
||||
for f in folders:
|
||||
print(f.decode())
|
||||
# Common: INBOX, [Gmail]/Sent Mail, [Gmail]/Drafts, [Gmail]/Spam, [Gmail]/Trash
|
||||
```
|
||||
|
||||
## Connection test (quick)
|
||||
|
||||
```python
|
||||
import socket
|
||||
|
||||
def test_gmail_imap():
|
||||
"""Quick connectivity test — no login."""
|
||||
try:
|
||||
ip = socket.getaddrinfo('imap.gmail.com', 993, socket.AF_INET, socket.SOCK_STREAM)
|
||||
print(f"DNS OK: {ip[0][4]}")
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"DNS FAIL: {e}")
|
||||
return False
|
||||
```
|
||||
Reference in New Issue
Block a user