29 lines
1.4 KiB
Markdown
29 lines
1.4 KiB
Markdown
# Bounce-Back Email Detection
|
|
|
|
Script: `/root/.hermes/scripts/bounce-check.py`
|
|
|
|
## What it does
|
|
|
|
Scans the `INBOX` for delivery-failure emails (Mailer-Daemon, Postmaster, "mail delivery failed" subjects) and reports them. Silent when no bounces found.
|
|
|
|
## Detection logic
|
|
|
|
| Signal | What it catches |
|
|
|---|---|
|
|
| Subject contains | `mail delivery failed`, `undelivered`, `delivery status notification`, `returned mail`, `non-delivery`, `undeliverable`, `delivery report`, `returned to sender`, `message bounced` |
|
|
| Sender contains | `mailer-daemon`, `postmaster`, `mail delivery system` |
|
|
| Body contains | `permanent error`, `could not be delivered` |
|
|
|
|
## Pitfalls
|
|
|
|
- **Sender string matching must be exact.** A sender like `bounces@alerts.oknotify3.com` (OkCupid) contains "bounces" in the local part, but the domain is a marketing platform — not a bounce. Only match known bounce-role senders (`mailer-daemon`, `postmaster`, `mail delivery system`).
|
|
- **Email headers can be `email.header.Header` objects** — calling `.lower()` on them raises `AttributeError`. Always convert via `str(val)` first.
|
|
- **MIME multipart messages:** The body check only examines `text/plain` parts. Bounces that are `text/html` only will not be caught by body content matching — subject/sender matching must catch them.
|
|
|
|
## Setup
|
|
|
|
```bash
|
|
cronjob(action='create', name='bounce-check', schedule='every 1h',
|
|
script='bounce-check.py', no_agent=True, deliver='origin')
|
|
```
|