Email Bounce Handling: Hard vs Soft Bounces and How to Process Them
How bounces work, the difference between hard and soft bounces, how to parse DSN messages, build a suppression list, and keep bounce rates under control.
How bounces work, the difference between hard and soft bounces, how to parse DSN messages, build a suppression list, and keep bounce rates under control.
A bounce is a delivery failure notification. Something in the chain between your application and the recipient's mailbox refused the message, and a report came back explaining why.
Bounces happen at two distinct moments, and confusing them makes debugging much harder.
A synchronous bounce happens during the SMTP session itself. The receiving server returns a 5xx at RCPT TO or after DATA, and your client sees the rejection immediately. These are the cleanest to handle because you have the error in hand at send time.
An asynchronous bounce happens after the receiving server has already accepted the message with a 250. It later discovers it cannot deliver — the mailbox is full, the account was disabled, an internal filter rejected it — and generates a Delivery Status Notification (DSN) sent back to your envelope sender address, often minutes or hours later.
Most large providers accept first and bounce later, so if you only handle synchronous failures you are seeing a fraction of the picture.
Hard bounces are permanent. The address will never work. Common causes:
Soft bounces are temporary. The address is valid but delivery failed right now:
The operational rule is simple and non-negotiable: suppress hard bounces immediately and permanently. Retry soft bounces, then suppress after repeated failures.
Continuing to mail a hard-bounced address is one of the fastest ways to destroy sender reputation. Mailbox providers read it as a sign that you do not maintain your list, which correlates strongly with spam.
A bounce message is a structured MIME document, not just prose. It contains a message/delivery-status part with machine-readable fields:
Reporting-MTA: dns; mail.example.com
Final-Recipient: rfc822; nonexistent@example.org
Action: failed
Status: 5.1.1
Diagnostic-Code: smtp; 550 5.1.1 User unknownThe fields you care about:
failed, delayed, or delivered.Parse the Status field first. It is standardised and reliable. Fall back to pattern-matching the Diagnostic-Code only when Status is missing, which happens with older or non-compliant servers.
Hard (suppress immediately):
| Code | Meaning |
|---|---|
| 5.1.1 | Bad destination mailbox address |
| 5.1.2 | Bad destination system — domain does not exist |
| 5.1.3 | Bad destination mailbox address syntax |
| 5.1.6 | Mailbox has moved |
| 5.2.1 | Mailbox disabled |
| 5.4.4 | Unable to route |
| 5.7.1 | Delivery not authorised — often a block |
Soft (retry):
| Code | Meaning |
|---|---|
| 4.2.2 | Mailbox full |
| 4.3.1 | Insufficient system storage |
| 4.4.1 | No answer from host |
| 4.4.2 | Connection dropped |
| 4.7.1 | Delivery not authorised, temporarily |
5.2.2 (mailbox full) is a special case. Technically permanent, but in practice the mailbox may be cleared. Treat it as soft, retry for a few days, and suppress if it never clears.
A production system needs five components.
1. A dedicated return path. Set the envelope sender (Return-Path) to a dedicated address on a subdomain you control, such as bounces@mail.yourdomain.com. This is where DSNs arrive. It also fixes SPF alignment for DMARC.
2. Webhook ingestion. If you use a transactional provider, consume its bounce webhooks rather than parsing mail yourself. Providers do the classification for you and deliver structured JSON. Verify the webhook signature, and make the handler idempotent — providers retry, and you will receive duplicates.
3. Classification. Map each event to hard, soft, or complaint. Store the raw diagnostic text alongside your classification so you can audit and correct the rules later.
4. A suppression list. A single table of addresses that must never be mailed again, checked before every send, at the transport layer rather than in each application feature. Columns: address, reason, source, timestamp. Never delete rows — a re-subscription should override with an explicit record, not by dropping the suppression.
5. Retry policy for soft bounces.
attempt 1 -> after 15 minutes
attempt 2 -> after 1 hour
attempt 3 -> after 4 hours
attempt 4 -> after 12 hours
attempt 5 -> after 24 hours
still failing after 72 hours -> treat as hard, suppressAdd jitter so parallel workers do not retry in lockstep.
A complaint — a recipient clicking "report spam" — is more damaging than a bounce. Providers report complaints through feedback loops, and the transactional providers surface them as webhook events.
Rules for complaints:
Note that Gmail does not provide a per-message feedback loop. You see aggregate spam rates in Google Postmaster Tools instead, which is why enrolling in Postmaster Tools is not optional.
Handling bounces is damage control. Preventing them is cheaper.
gmial.com or hotmial.com.| Metric | Healthy | Warning | Critical |
|---|---|---|---|
| Hard bounce rate | under 2% | 2–5% | above 5% |
| Soft bounce rate | under 5% | 5–10% | above 10% |
| Complaint rate | under 0.1% | 0.1–0.3% | above 0.3% |
| Unsubscribe rate | under 0.5% | 0.5–1% | above 1% |
Above 5 percent hard bounces, most providers begin throttling. Above 10 percent, expect outright blocking.
Bounce data contains personal information. Keep the suppression list — you are legally required to honour unsubscribes and practically required to avoid dead addresses — but purge detailed diagnostic logs on a schedule, typically 90 days. Document the retention policy alongside your other data-protection records.
A surprising number of "bounce spikes" turn out to be a broken relay: an expired credential, a certificate that lapsed, a firewall rule added during a migration. Before you start pruning addresses, confirm that your SMTP server still accepts your connection, negotiates TLS, and authenticates correctly. SMTPTester answers all three in a single check, and ruling out the transport layer first will save you from deleting a perfectly good list.
Apply what you just learned. Free, no signup, results in seconds.
Open the tool →A complete guide to testing SMTP servers — online testing, telnet and openssl commands, TLS verification, authentication checks and a repeatable diagnostic workflow.
Provider GuidesHow to send email through Microsoft 365 — SMTP AUTH settings, enabling authenticated SMTP, direct send, high-volume connectors, OAuth, limits and error fixes.