How SMTP reply codes work
Every SMTP command gets a 3-digit response. Two important groupings:
- 2xx โ success.
- 3xx โ provisional; server is waiting for more.
- 4xx โ temporary failure. Try again later.
- 5xx โ permanent failure. Don't retry; bounce.
2xx โ Positive responses
| Code | Meaning |
| 220 | Service ready (server's first message) |
| 221 | Closing channel (after QUIT) |
| 235 | Authentication successful |
| 250 | OK โ most common success response |
| 251 | User not local; will forward |
| 252 | Cannot VRFY user but will accept message |
3xx โ Intermediate (waiting)
| Code | Meaning |
| 334 | Continue authentication (server expects next AUTH chunk) |
| 354 | Start mail input โ end with <CRLF>.<CRLF> |
4xx โ Temporary failure (retry)
| Code | Meaning |
| 421 | Service not available, closing channel. Overloaded or shutting down. |
| 450 | Mailbox temporarily unavailable. Try later. |
| 451 | Local error in processing. Often greylisting or quota. |
| 452 | Insufficient system storage. Mailbox or disk full. |
| 454 | TLS not available / authentication failed temporarily |
5xx โ Permanent failure (bounce)
| Code | Meaning |
| 500 | Syntax error, command unrecognized |
| 501 | Syntax error in parameters or arguments |
| 502 | Command not implemented |
| 503 | Bad sequence of commands |
| 530 | Authentication required (STARTTLS-only or AUTH-required server) |
| 535 | Authentication credentials invalid |
| 550 | Mailbox unavailable. Most common bounce โ user doesn't exist or rejected by policy. |
| 551 | User not local; please try <forward-path> |
| 552 | Mail action aborted: exceeded storage allocation |
| 553 | Mailbox name not allowed |
| 554 | Transaction failed โ "I don't like your message" |
Enhanced Status Codes (RFC 3463) โ the dot codes
You'll often see replies like 550 5.1.1 The email account that you tried to reach does not exist. That 5.1.1 is an Enhanced Status Code, formatted class.subject.detail.
The common ones
| Code | Meaning |
| 5.1.1 | Bad destination mailbox address (user doesn't exist) |
| 5.1.2 | Bad destination system address (domain doesn't exist) |
| 5.1.8 | Bad sender's system address |
| 5.2.1 | Mailbox disabled |
| 5.2.2 | Mailbox full |
| 5.4.1 | No answer from host |
| 5.4.4 | Unable to route |
| 5.7.1 | Delivery not authorized โ message rejected by policy (SPF/DKIM/DMARC fail, blacklist) |
| 5.7.26 | Multiple authentication checks failed |
| 4.4.1 | No answer from host (temp) |
| 4.7.1 | Delivery temporarily blocked |
If you're debugging bounces
The numerical reply code tells you success/failure category. The enhanced code tells you why. The text after is the human-readable explanation, varies by server. When troubleshooting deliverability, always look at all three โ the text often points to specific SPF/DKIM/DMARC issues or blocklist hits.
Common bounce reasons by code
| Bounce | Likely cause |
| 550 5.1.1 | Recipient address invalid โ typo, user left company |
| 550 5.2.2 | Mailbox full |
| 550 5.7.1 SPF | Your IP isn't in the sender's SPF record |
| 550 5.7.1 DMARC | DMARC alignment failed (SPF and/or DKIM didn't align with From: domain) |
| 550 5.7.1 listed at... | Your sending IP is on a blacklist (Spamhaus, etc.) |
| 421 4.7.0 Try again later | Greylisting โ server expects a retry. Will succeed in 5-30 min. |
| 451 4.7.1 Greylisting | Same as above, different format |
| 550 5.7.26 Multi-auth fails | Gmail-style: SPF, DKIM, DMARC all failed; message rejected |