Install
openclaw skills install email-verifierVerify email address deliverability via SMTP without sending mail. Checks MX records, performs RCPT TO verification, and detects catch-all domains. Use when validating email lists, checking if an email address exists before sending, cleaning lead lists, or verifying contact information. Supports single emails, batch verification, and CSV input.
openclaw skills install email-verifierVerify whether email addresses are deliverable by connecting to the recipient's mail server and checking if it accepts the address — without actually sending any mail.
pip3 install dnspython
python3 scripts/verify_email.py user@example.com another@domain.com
echo "user@example.com" | python3 scripts/verify_email.py --stdin
python3 scripts/verify_email.py --csv leads.csv --email-column "Contact Email"
--helo DOMAIN — HELO domain for SMTP greeting (default: verify.local)--timeout SECONDS — Connection timeout (default: 10)JSON array to stdout. Each result contains:
{
"email": "user@example.com",
"domain": "example.com",
"mx_host": "aspmx.l.google.com",
"smtp_code": 250,
"smtp_response": "2.1.5 OK",
"deliverable": "yes"
}
| Value | Meaning |
|---|---|
yes | Server accepted the recipient |
no | Server rejected the recipient (invalid) |
catch-all | Server accepts all addresses — cannot confirm inbox exists |
unknown | Could not determine (timeout, block, greylisting) |
The script includes built-in rate limiting to protect your IP reputation:
# Defaults: 1s between checks, max 20 per domain before 30s pause
python3 scripts/verify_email.py --csv leads.csv --email-column "Contact Email"
# Conservative: slower checks, lower burst limit
python3 scripts/verify_email.py --delay 3 --max-per-domain 10 --burst-pause 60 email@example.com
# Aggressive (not recommended from residential IPs)
python3 scripts/verify_email.py --delay 0.5 --max-per-domain 50 email@example.com
--delay SECONDS — Pause between each check (default: 1.0)--max-per-domain N — Max checks to one domain before pausing (default: 20)--burst-pause SECONDS — How long to pause after hitting the per-domain limit (default: 30)SMTP verification connects directly to mail servers. Without rate limiting:
| Scenario | Recommended settings |
|---|---|
| Quick spot check (1-5 emails) | Defaults are fine |
| Small lead list (10-50 emails) | --delay 2 --max-per-domain 15 |
| Larger batch (50-200 emails) | --delay 3 --max-per-domain 10 --burst-pause 60 |
| Bulk verification (200+) | Use a dedicated service (ZeroBounce, NeverBounce) instead |
Rule of thumb: Stay under 50 unique domain checks per day from a residential IP. For repeated checks to the same domain (pattern guessing), stay under 15 per session.