
Your campaign goes out to 50,000 recipients and the bounce report comes back with a wall of three-digit codes — 550, 451, 552, 421 — each attached to a cryptic message from a remote mail server. Some of these codes mean the address is permanently dead and should never receive another message. Others mean the server was temporarily busy and will likely accept the message on the next attempt. Treating them the same way — or worse, ignoring the distinction entirely — leads to suppressing valid addresses, continuing to send to invalid ones, and gradually degrading your sender reputation through mishandled bounce events.
SMTP bounce codes are not arbitrary. They follow a structured system defined in RFC 5321 and extended by RFC 3463, and each code tells you something specific about why delivery failed. Understanding this system transforms bounce handling from guesswork into a precise, automated process that protects both your list quality and your deliverability.
Every email delivery involves a conversation between two mail servers — your sending server (or your ESP's server) and the recipient's mail server. This conversation follows the SMTP protocol and proceeds in a specific sequence:
RCPT TO is accepted, your server transmits the message body and headers.At each step, the receiving server responds with a three-digit code. If the code starts with 2, the command succeeded. If it starts with 4, the command failed temporarily. If it starts with 5, the command failed permanently. These response codes are the raw material of your bounce reports.
SMTP response codes follow a three-digit structure where each digit carries meaning.
| First Digit | Meaning | Action |
|---|---|---|
| 2xx | Success | Message accepted for delivery |
| 4xx | Temporary failure | Retry later — the problem may resolve |
| 5xx | Permanent failure | Do not retry — the delivery cannot succeed |
| Second Digit | Category |
|---|---|
| x0x | Syntax — the command was malformed |
| x1x | Information — status or help responses |
| x2x | Connection — related to the transmission channel |
| x5x | Mail system — related to the recipient's mail system status |
The third digit narrows the cause further within the category. For example, within the 55x range: 550 means the mailbox is unavailable, 551 means the user is not local, 552 means the mailbox storage limit was exceeded, and 553 means the mailbox name is not allowed.
A 5xx response means the receiving server has definitively rejected the delivery attempt. These addresses require immediate action — continuing to send to them damages your sender reputation and wastes resources.
550 — Mailbox unavailable / User unknown
The most common hard bounce. The recipient address does not exist on the receiving server. The RCPT TO command was rejected because the mailbox is not found.
551 — User not local; please try forwarding
The receiving server knows the user but they are not hosted locally. Some servers provide a forwarding address in the response.
552 — Exceeded storage allocation
The recipient's mailbox is full and cannot accept new messages.
553 — Mailbox name not allowed
The address syntax is valid in general but violates the receiving server's specific policies for mailbox names.
554 — Transaction failed / Message rejected
A general rejection that can occur at any stage of the SMTP conversation. Often accompanied by an extended status code or human-readable explanation.
Large mailbox providers often return 550 with additional context in the human-readable portion of the response:
550 5.1.1 The email account that you tried to reach does not exist (Gmail) — Permanent. Suppress.550 5.2.1 The email account that you tried to reach is disabled (Gmail) — Permanent. Suppress.550 Requested action not taken: mailbox unavailable (generic) — Permanent. Suppress.550 5.7.1 Service unavailable, client host blocked — Not a mailbox issue. This is a reputation or policy block on your sending IP/domain. Do not suppress the recipient — investigate your sending reputation.This last example illustrates why reading the full bounce message matters. A 550 code does not always mean the address is bad — it sometimes means your server is blocked.
A 4xx response means the delivery failed for a reason that may resolve on its own. Your sending system should retry these automatically, but you need policies for when retries should stop.
421 — Service not available / Try again later
The receiving server is temporarily unable to process the connection, often due to load or maintenance.
450 — Mailbox unavailable (busy)
The mailbox exists but is temporarily locked or unavailable.
451 — Requested action aborted: local error in processing
The receiving server encountered an internal error.
452 — Insufficient system storage
The receiving server's disk is full, affecting all incoming mail — not just your message.
Greylisting is an anti-spam technique where the receiving server temporarily rejects the first delivery attempt from an unknown sender with a 4xx code (typically 450 or 451), expecting legitimate senders to retry. Your sending system must handle this by retrying after 5-15 minutes. If it does not retry, greylisted messages appear as bounces when they would have been accepted on the second attempt.
RFC 3463 introduced enhanced status codes that provide more granular information alongside the basic three-digit code. These appear in the format x.y.z where:
| Enhanced Code | Meaning | Action |
|---|---|---|
| 5.1.1 | Bad destination mailbox address | Suppress — address does not exist |
| 5.1.2 | Bad destination system address | Suppress — domain does not exist or has no MX |
| 5.2.1 | Mailbox disabled, not accepting messages | Suppress — account deactivated |
| 5.2.2 | Mailbox full | Retry once, then suppress if persistent |
| 5.3.0 | Other mail system status | Read full message — varies by provider |
| 5.7.1 | Delivery not authorized, message refused | Check reputation and authentication — not necessarily a bad address |
| 4.2.2 | Mailbox full (temporary) | Retry with backoff |
| 4.4.1 | No answer from host | Retry — receiving server is unreachable |
| 4.7.1 | Delivery not authorized (temporary) | Often rate limiting — reduce send volume and retry |
Enhanced status codes are more reliable than the basic three-digit code alone because they disambiguate situations where the same basic code (e.g., 550) is used for fundamentally different reasons.
Raw bounce codes become actionable when you map them to automated responses in your sending infrastructure.
| Code Pattern | Classification | Automated Response | Suppression? |
|---|---|---|---|
| 550 + 5.1.1 / 5.1.2 | Hard bounce — invalid address | Suppress immediately | Yes, permanent |
| 550 + 5.2.1 | Hard bounce — disabled account | Suppress immediately | Yes, permanent |
| 550 + 5.7.1 | Block — reputation/policy | Alert ops team; do not suppress recipient | No |
| 552 / 5.2.2 | Soft — mailbox full | Retry once next send; suppress after 3 consecutive failures | Conditional |
| 421 / 450 / 451 | Soft — temporary server issue | Automatic retry with exponential backoff (up to 72 hours) | No |
| 4.7.1 | Soft — rate limited | Reduce sending rate; retry after delay | No |
| 553 / 5.1.3 | Hard bounce — bad address syntax | Suppress immediately | Yes, permanent |
| Metric | Target | Red Flag |
|---|---|---|
| Hard bounce rate per campaign | < 0.5% | > 2% — list quality issue, pause and validate |
| Soft bounce rate per campaign | < 3% | > 5% — investigate server-side or throttling issues |
| Soft-to-hard conversion rate | Trending downward | Rising — retry logic or thresholds may be misconfigured |
| Bounce reason distribution | No single code > 50% | One code dominating — investigate systemic cause |
| Time to suppress hard bounces | < 1 hour after bounce event | > 24 hours — automation gap |
A 550 response with a 5.7.1 enhanced code means your server was blocked by policy — the recipient address may be perfectly valid. Suppressing these addresses loses viable contacts. Always read the enhanced code and the human-readable bounce message before classifying.
A mailbox that has been full for six months is effectively dead. If your system retries indefinitely without a conversion threshold, these addresses accumulate in your active list, generating predictable failures every campaign and depressing your delivery metrics.
The opposite problem. Converting a single soft bounce to a hard suppression loses addresses that experienced a one-time server issue. Require at least two to three consecutive soft bounces across separate send events before suppressing.
If 80% of your bounces are 5.7.1 policy blocks from a single provider, you do not have a list quality problem — you have a reputation or authentication problem with that provider. The operational response is completely different. Monitor bounce reasons as a distribution, not just a total rate.
Bounce handling is reactive — it processes failures after they occur. Pre-send email validation catches invalid addresses, disposable domains, and syntax errors before they generate bounces. Running validation before a campaign reduces your hard bounce rate at the source, preserving your reputation score and keeping you below provider thresholds.
SMTP bounce codes encode specific, actionable information about why a delivery failed. The three-digit base code tells you whether the failure is permanent or temporary. The enhanced status code tells you whether the problem is the address, the mailbox, the server, or your own reputation. Building an automated response framework that parses both codes, classifies bounces accurately, and applies appropriate suppression or retry logic transforms bounce management from a reactive chore into a system that continuously protects your list quality and sender reputation. The critical distinction is between address-level failures that require suppression and infrastructure or policy failures that require investigation — treating them interchangeably is the most common and most costly mistake in bounce handling.
Start with 200 free validations. Upgrade only when you're ready.
No credit card required • Cancel anytime