A bounce message is only as useful as your ability to actually read the code inside it. The first-digit rule: 4xx is temporary — try later. 5xx is permanent — don’t retry without changing something.
But the three-digit code often isn’t precise enough, which is why the chapter covers enhanced status codes — the X.Y.Z format from RFC 3463 riding alongside the traditional code. 550 5.1.1 and 550 5.7.1 are both permanent 550s, but one means the mailbox doesn’t exist and the other means a policy block — completely different fixes.
Organized as a genuine lookup table, not a top-ten list — the page people bookmark the first time a bounce doesn’t make immediate sense.
The three-digit convention itself dates to RFC 821 (1982), where Jon Postel modeled it on FTP’s existing response-code system, itself inherited from an even earlier time-sharing protocol. The design proved durable enough that HTTP borrowed the same pattern six years later (200 OK, 404 Not Found, 500 Internal Server Error), and it’s still in active use across both protocols more than four decades on. The second digit narrows things further than most people realize: x0x flags syntax problems, x1x covers informational detail, x2x relates to connection-level issues, and x5x points to mail-system or storage state — which is why 451 4.7.0 shows up specifically during greylisting, a deliberate temporary rejection meant to filter out spam senders that never bother retrying, while 452 4.2.2 means something completely different: the recipient’s mailbox is simply full. Same first digit, same try-again instruction to the sending queue, entirely different root cause and entirely different fix.
One more distinction worth keeping straight: 421 4.7.0 usually means the receiving server is temporarily unreachable or overloaded and will accept a retry shortly, while 421 4.7.28 is a deliberate rate-limit response — the receiver is telling a specific sending IP to slow down, often seen during IP warm-up when a new sending address ramps up volume too aggressively. Reading past the bare three-digit code into the enhanced status code is usually the fastest way to tell which of those two very different situations is actually happening.