What’s a 5xx permanent rejection vs a 4xx temporary one?
Still have a question, spotted an error, or have a better explanation or a source we should cite?
A 5xx code is the receiving server saying "no, and don't ask again." A 4xx code is "not right now, try later." Your sending system has to react to those two answers in completely different ways, and getting it wrong is one of the fastest ways to wreck sender reputation.
5xx: permanent rejection (hard bounce)
When a receiving mail server returns a code starting with 5, the SMTP transaction has hit a permanent failure. RFC 5321 section 4.2.1 is explicit: a 5yz reply means the command failed and the client "is discouraged from repeating the exact request." The message is dead. Stop trying.
Common 5xx codes you will see:
- 550 - mailbox unavailable, usually "user not found" or "address does not exist"
- 551 - user not local, no forwarding
- 552 - mailbox full, exceeded storage allocation (some providers send this as 5xx, some as 4xx, check the enhanced status code)
- 553 - mailbox name not allowed, syntactically bad address
- 554 - transaction failed, often the catch-all for "we think this is spam" or "your IP is blocked"
A 550 on a clean send means the address is bad. Suppress it immediately. A 554 with a URL in the response text usually means you hit a blocklist or content filter, and the body of the response will tell you where to go to investigate. This is one of the places IP-level vs content-level rejections matters: the code is the same, the fix is not.
4xx: temporary rejection (soft bounce)
A 4yz reply means the command failed for a transient reason. The sender is expected to retry, with backoff. Examples:
- 421 - service not available, the server is shutting down the connection (often rate limiting)
- 450 - mailbox unavailable, usually busy or locked
- 451 - local error in processing, try again
- 452 - insufficient system storage on the receiving side
4xx is also how greylisting works. The server deliberately returns a 4xx on first contact from an unknown sender, watches whether you retry properly, and accepts on the second attempt. Spammers usually do not bother retrying, so this kills a chunk of junk without ever touching content.
How real sending systems behave
A properly built MTA (mail transfer agent, the software that actually moves mail between servers) does three things:
- On 5xx: stop. Mark the recipient as a hard bounce, remove from future sends, do not retry.
- On 4xx: queue and retry with exponential backoff. RFC 5321 recommends a retry window of at least 4-5 days before giving up.
- On repeated 4xx that eventually fail: treat the final outcome as a bounce but classify it differently in your reporting. A persistent 4xx that times out is not the same signal as a clean 550.
If you are using an ESP (email service provider) like SendGrid, Mailgun, or Postmark, this is handled for you. If you are sending through your own infrastructure, or through a script that wraps SMTP directly, this is the part people get wrong. Retrying a 550 burns your IP reputation fast, because receiving providers track senders that keep hammering addresses they already rejected.
Why it matters for your list
Every 5xx you ignore is a future complaint or spam trap hit waiting to happen. The mailbox provider already told you the address is bad. If you keep sending, you are telling them you do not respect their signals, which is exactly the sender behavior pattern that filters track when deciding whether to put you in spam.
Check your ESP's bounce report weekly. Anything with a 5.x.x enhanced status code (the second number set in the response, like 5.1.1 for "bad destination mailbox") should be suppressed permanently. 4.x.x codes can stay in the list, but if the same address soft-bounces three sends in a row, treat it as dead.
Contributors
Who worked on this answer
Every name links to their profile. Every company links to their site. Real people, real accountability.