SMTP bounce codes explained: 4xx vs 5xx and enhanced status codes
Last updated: 26:10:2026
Anatomy of an SMTP error
When a mail server refuses a message, it answers with a line like this, and the same line ends up in the bounce message you receive:
A typical rejection
550 5.1.1 The email account that you tried to reach does not exist.550is the basic reply code, defined by the SMTP standard (RFC 5321). Every SMTP server sends one.5.1.1is the enhanced status code (RFC 3463), a more precise classification that almost every modern server includes.- The rest is free text. It isn't standardized, but it is often the most useful part: large providers put the exact reason, and sometimes a help link, there.
The basic reply code
The first digit is what decides how the sending server reacts:
| Code | Meaning | Sending server should |
|---|---|---|
2xx | Positive completion - the command succeeded | Continue; after the message data, the receiver now owns delivery |
3xx | Positive intermediate - send more (354 after DATA) | Send the message content |
4xx | Transient negative completion - not now | Keep the message and retry later |
5xx | Permanent negative completion - no | Stop and return the message to its sender |
2xx3xx4xx5xxRFC 5321 tells the sending side to wait before retrying - the retry interval should generally be at least 30 minutes - and to keep trying for a while: the give-up time "generally needs to be at least 4-5 days". In practice, many senders retry sooner at first and give up earlier.
The reply codes you'll actually see in bounces:
| Code | RFC 5321 description | In practice |
|---|---|---|
421 | Service not available, closing transmission channel | Receiver busy, rate limiting you, or deferring for reputation |
450 | Mailbox unavailable (busy or temporarily blocked for policy reasons) | Greylisting or a temporary policy block |
451 | Requested action aborted: local error in processing | Temporary problem at the receiver, also used for greylisting |
452 | Insufficient system storage | Too many recipients in one transaction, or the receiver is out of space |
550 | Mailbox unavailable (not found, no access, or rejected for policy reasons) | Address doesn't exist - or a policy/spam rejection; read the enhanced code |
551 | User not local | Rare today |
552 | Exceeded storage allocation | Mailbox full or message too large |
553 | Mailbox name not allowed | Invalid address syntax, or a sender address the server won't accept |
554 | Transaction failed (or "No SMTP service here") | Generic permanent rejection, often after the message content was scanned |
521 / 556 | Host / domain does not accept mail (RFC 7504) | The domain publishes a "null MX" (RFC 7505) - it never receives mail |
421450451452550551552553554521 / 556Two quirks are worth knowing. 550 covers both "no such user" and "we don't want your mail", so on its own it tells you little. And RFC 5321 notes that an old standard wrongly used 552 for "too many recipients" - the correct code is 452, and clients should treat a 552 received for that reason as temporary.
Enhanced status codes
RFC 3463 defines a three-part code, class.subject.detail. The class repeats the first digit: 2 success, 4 persistent transient failure, 5 permanent failure. The subject is the most useful part, because it tells you where the problem lies:
| Subject | Area | Typically means |
|---|---|---|
X.0.X | Other or undefined | No more specific code applies |
X.1.X | Addressing | Something about the address itself: unknown user or domain |
X.2.X | Mailbox | The mailbox exists but can't accept: full, disabled |
X.3.X | Mail system | The receiving system: message too big, system not accepting mail |
X.4.X | Network and routing | Couldn't connect, no route, delivery time expired |
X.5.X | Mail delivery protocol | SMTP protocol problems, too many recipients |
X.6.X | Message content or media | Content conversion problems |
X.7.X | Security or policy | Authentication, reputation, spam and policy blocks |
X.0.XX.1.XX.2.XX.3.XX.4.XX.5.XX.6.XX.7.XThe detail codes are registered with IANA. Some are part of RFC 3463, others came later - RFC 7372 added codes for failed email authentication, RFC 7505 the ones for null MX.
Common bounces and what to do
| Code | IANA description | What to do |
|---|---|---|
5.1.1 | Bad destination mailbox address | Hard bounce: the address doesn't exist. Check for typos, then remove it from your list. |
5.1.2 | Bad destination system address | The domain doesn't exist or has no mail server. Check the spelling (gmial.com) and remove it. |
5.1.10 | Recipient address has null MX | The domain declares it never receives mail. Remove the address. |
5.2.1 | Mailbox disabled, not accepting messages | Usually a closed or inactive account. Treat as a hard bounce if it repeats. |
4.2.2 / 5.2.2 | Mailbox full | Temporary on the recipient's side. Retry later; if it persists for weeks, the mailbox is likely abandoned. |
5.2.3 / 5.3.4 | Message length exceeds administrative limit / too big for system | Make the message smaller - link to large files instead of attaching them. |
4.4.1 / 4.4.2 | No answer from host / bad connection | Network problem reaching the receiver. Your server retries automatically. |
5.4.4 | Unable to route | No usable MX or A record for the domain. Check its DNS. |
4.4.7 | Delivery time expired | Your server gave up after retrying for its whole retry window. Find out why the earlier attempts failed. |
4.7.1 / 5.7.1 | Delivery not authorized, message refused | A policy decision: reputation, spam filter, blocklist or a recipient-side rule. Read the text. |
5.7.8 | Authentication credentials invalid | Your own mail client or app failed to log in to its SMTP server - fix the username or password. |
5.7.20 / 5.7.23 / 5.7.25 | No passing DKIM signature / SPF validation failed / reverse DNS validation failed | Fix the named check: DKIM, SPF or the PTR record of the sending IP. |
5.7.26 | Multiple authentication checks failed | Typically DMARC: neither SPF nor DKIM passed with an aligned domain. |
5.1.15.1.25.1.105.2.14.2.2 / 5.2.25.2.3 / 5.3.44.4.1 / 4.4.25.4.44.4.74.7.1 / 5.7.15.7.85.7.20 / 5.7.23 / 5.7.255.7.26Providers don't always use the codes the same way. RFC 3463 says "mailbox full" should be a transient failure, yet some servers send it as 552 5.2.2; and 5.7.1 covers anything from a blocklist hit to a recipient's "only accept mail from colleagues" rule. The provider-specific guides for Gmail and Outlook decode their texts.
Soft bounce vs hard bounce
These terms come from the email marketing world, not from any RFC, but they map onto the codes like this:
- A soft bounce is a temporary failure - a
4xxreply, or a mailbox-full response. The address is valid; delivery may succeed later. Your server retries on its own. - A hard bounce is a permanent failure about the address -
5.1.1,5.1.2,5.1.10, usually also a repeated5.2.1. Retrying won't help. - A block is a permanent failure about you, not the address -
5.7.xpolicy and reputation rejections. Don't delete the recipient; fix the authentication or reputation problem and the same address will accept mail again.
Remove hard-bouncing addresses after the first bounce. Repeatedly sending to addresses that don't exist is one of the clearest signals of a bought or stale list, and receivers lower your reputation for it. A soft bounce that repeats across many sends over weeks should be treated as a hard one.
Rejected or bounced: when the error reaches you
A failure can surface in two ways:
- During the SMTP conversation. The receiving server refuses with a
4xxor5xxbefore accepting the message. Your own sending server then knows the reason first-hand and either retries or writes you a bounce report. - After acceptance. The receiver answered
250and later found it couldn't deliver - for example a forwarding address that failed. It must then send a bounce to the envelope sender. When the envelope sender was forged, these bounces hit innocent people: that's called backscatter, and it's why well-run servers try to reject during the SMTP conversation instead of accepting and bouncing later.
What a DSN (bounce report) contains
A bounce message is formally a Delivery Status Notification, defined by RFC 3464. It is a MIME message of type multipart/report (RFC 6522) with report-type=delivery-status and up to three parts: a human-readable explanation, a machine-readable message/delivery-status part, and the original message or its headers. The machine-readable part is what bounce-processing software reads:
The delivery-status part of a DSN
Reporting-MTA: dns; mail.example.com
Arrival-Date: Mon, 26 Oct 2026 09:12:44 +0100
Final-Recipient: rfc822; jan@example.net
Action: failed
Status: 5.1.1
Remote-MTA: dns; mx.example.net
Diagnostic-Code: smtp; 550 5.1.1 User unknown
Last-Attempt-Date: Mon, 26 Oct 2026 09:12:46 +0100Actionisfailed(gave up),delayed(still retrying - a warning, not a bounce),delivered,relayedorexpanded.Statusis the enhanced status code;Diagnostic-Codeis the receiving server's exact reply, andRemote-MTAthe server that gave it.- A DSN produced by your own server after a
4xxstreak that ran out of time typically carries4.4.7or the last temporary error it got.
How AnyMail reports delivery failures
AnyMail sends external mail directly to the recipient's mail server and follows the same rules: a 4xx reply is retried with growing intervals for a little over two days (up to 10 attempts), while a 5xx reply fails the message at once and shows the receiving server's reason next to it. When a message fails for good, an RFC 3464 report lands in the sending inbox, and if delivery is still being retried hours later you get a single "delayed" notice too. Recipients who unsubscribed through the one-click link are treated as permanent failures instead of being mailed again. For incoming mail, AnyMail rejects during the SMTP conversation rather than accepting and bouncing later, so it never produces backscatter.
Let AnyMail handle these records for you
AnyMail generates the MX, SPF, DKIM and DMARC records for your domain, checks every one of them automatically and tells you exactly which record to fix - then hosts your inboxes, operated from the EU.