📧 Email Deliverability
8 dk okuma
Email Bounce Management & List Hygiene
Handle email bounces properly, understand hard vs soft bounces, and maintain list hygiene to protect your sender reputation.
Bounce Types
| Type | SMTP Code | Meaning | Action |
|---|---|---|---|
| Hard bounce | 550, 551, 552, 553 | Permanent failure (address does not exist) | Remove immediately |
| Soft bounce | 450, 451, 452 | Temporary failure (mailbox full, server down) | Retry, remove after 3-5 attempts |
| Block bounce | 550 + policy text | Rejected by policy (spam filter, blacklist) | Investigate and fix root cause |
Common SMTP Bounce Codes
550 5.1.1 — User unknown (hard bounce — remove address)
550 5.7.1 — Message rejected (spam filter or policy)
552 5.2.2 — Mailbox full (soft bounce — retry later)
421 4.7.0 — Temporarily rate limited (slow down sending)
450 4.2.1 — Mailbox disabled (soft → remove after retries)
Automated Bounce Processing
Your email service provider (ESP) handles most bounce processing automatically, but if you run your own mail server:
# Pseudocode for bounce handling
def process_bounce(bounce_event):
if bounce_event.type == "hard":
# Permanent failure — never send again
subscriber.status = "hard_bounced"
subscriber.suppress()
elif bounce_event.type == "soft":
subscriber.soft_bounce_count += 1
if subscriber.soft_bounce_count >= 3:
# Persistent soft bounces → treat as hard
subscriber.status = "soft_bounced"
subscriber.suppress()
elif bounce_event.type == "complaint":
# User marked as spam — critical
subscriber.status = "complained"
subscriber.suppress() # Required by law
List Hygiene Practices
Regular Cleaning
- Remove hard bounces — Immediately, no exceptions.
- Suppress complaints — Anyone who marks you as spam is permanently removed.
- Re-engagement campaigns — After 90 days of no engagement, send a "do you still want to hear from us?" email. Remove non-responders.
- Sunset inactive subscribers — Remove addresses with no engagement after 6-12 months.
Prevention
- Double opt-in — Confirm email address before adding to list.
- Email validation at signup — Use syntax and MX record checks.
- Avoid role addresses —
info@,admin@,support@have high complaint rates. - Honor unsubscribes instantly — Process within 24 hours (legally required within 10 days in CAN-SPAM).
Monitoring List Health
| Metric | Healthy List | Needs Attention |
|---|---|---|
| Hard bounce rate | <0.5% per send | >2% |
| List growth rate | Positive | Declining |
| Engagement rate | >20% opens | <10% |
| Complaint rate | <0.05% | >0.1% |
| Unsubscribe rate | <0.5% | >1% |
Tools for Verification
Before sending to an old or purchased list (which you should not purchase), verify addresses:
- ZeroBounce, NeverBounce, BriteVerify — Bulk email verification services.
- MX record check — Verify the recipient domain has active mail servers.
- SMTP check — Connect to the recipient's mail server and verify the address without sending.