SMTP Error Codes, From 211 to 556
An SMTP server answers every command with a three-digit reply code followed by a line of text. The first digit says whether the command worked: 2 for success, 3 for "send me more", 4 for a temporary failure, 5 for a permanent one. The second digit narrows the category. The third is the finest gradation. The text after the digits is written for a human, not for a parser.
That first digit is the only part you can act on without reading anything else. A 4xx means queue it and try again. A 5xx means stop. Everything below is the full list, grouped by class, with one line on what each code actually calls for.
How is an SMTP reply code structured?
RFC 5321 assigns each digit a job. The first denotes whether the response is good, bad, or incomplete. The second tells you approximately what kind of error occurred. The third, plus any supplemental text, carries the finest detail.
First digit:
| Digit | Class | Meaning |
|---|---|---|
2yz | Positive Completion | The requested action has been successfully completed. |
3yz | Positive Intermediate | The command was accepted but the action is held pending further input. |
4yz | Transient Negative Completion | The action did not occur, the condition is temporary, and the client SHOULD try again. |
5yz | Permanent Negative Completion | The action did not occur and the client SHOULD NOT repeat the exact request. |
Second digit: x0z syntax, x1z information, x2z connections, x3z and x4z unspecified, x5z mail system status.
RFC 5321 also gives a rule of thumb for deciding whether something belongs in 4yz or 5yz. A reply is 4yz if repeating the identical command, unchanged, could plausibly succeed later without the sender or receiver changing anything. If it could not, it belongs in 5yz.
Which SMTP codes mean success?
These are the 2xx and 3xx replies. Nothing here is an error, though one of them is routinely misread as proof of something it does not prove.
| Code | Meaning | What to do |
|---|---|---|
211 | System status, or system help reply | Informational. No action. |
214 | Help message | Informational, aimed at the human reading the session. No action. |
220 | <domain> Service ready | The greeting. Continue with EHLO. |
221 | <domain> Service closing transmission channel | Normal response to QUIT. Session over. |
250 | Requested mail action okay, completed | Success. The command was accepted. |
251 | User not local; will forward to <forward-path> | Accepted for onward relay. Nothing to fix. |
252 | Cannot VRFY user, but will accept message and attempt delivery | The server declines to confirm the address exists. Do not read it as address validation. |
354 | Start mail input; end with <CRLF>.<CRLF> | Send the message body, terminated by a lone dot on its own line. |
One consequence worth knowing. Once a server returns a 2yz after the <CRLF>.<CRLF> that ends a DATA block, it has accepted responsibility for delivering the message, or for retrying transient failures a reasonable number of times under its own policy. After that point the outcome is the receiving server's problem, and any failure reaches you as a bounce rather than as a live reply code.
What do the 4xx SMTP codes mean?
Temporary. The condition is expected to clear. Queue the message and retry, and do not remove the address from your list.
| Code | Meaning | What to do |
|---|---|---|
421 | <domain> Service not available, closing transmission channel | Retry later. Can arrive in reply to any command when the server knows it must shut down. |
450 | Requested mail action not taken: mailbox unavailable (mailbox busy or temporarily blocked for policy reasons) | Retry. Keep the address. |
451 | Requested action aborted: local error in processing | A failure on the receiving side. Retry. |
452 | Requested action not taken: insufficient system storage | Storage pressure on the server as a whole, not on one mailbox. Retry later. |
455 | Server unable to accommodate parameters | Retry. The server could not accept a command parameter at that moment. |
How long should a sender retry?
RFC 5321 sets a floor and a ceiling. Delay at least 30 minutes before the first retry after a failure. Keep retrying until the message is transmitted or you give up, and the give-up time generally needs to be at least four to five days. The pattern the spec describes, on the observation that failures are usually a crashed target system or connection, is two connection attempts in the first hour the message is queued, then backing off to one attempt every two or three hours.
One related rule that catches senders out: 5yz responses to the MAIL command must not be cached. A permanent failure applies to that transaction, not forever.
What do the 5xx SMTP codes mean?
Permanent. Repeating the same command in the same form will fail the same way. Fix the request, fix the address, or stop sending to it.
| Code | Meaning | What to do |
|---|---|---|
500 | Syntax error, command unrecognized (includes command line too long) | Fix the client. The server did not recognize the command at all. |
501 | Syntax error in parameters or arguments | Fix the argument sent with the command. |
502 | Command not implemented | The server recognizes the command but does not implement it. Stop sending it. |
503 | Bad sequence of commands | The client sent commands out of order. Fix the session state machine. |
504 | Command parameter not implemented | The command is supported, the parameter is not. Drop the parameter. |
550 | Requested action not taken: mailbox unavailable (mailbox not found, no access, or command rejected for policy reasons) | Do not retry. Read the text, because this covers both "no such mailbox" and policy rejection. |
551 | User not local; please try <forward-path> | The server will not relay. Send to the address it names. |
552 | Requested mail action aborted: exceeded storage allocation | That specific mailbox or message exceeded its quota. |
553 | Requested action not taken: mailbox name not allowed (mailbox syntax incorrect) | The address itself was rejected. Fix it or remove it. |
554 | Transaction failed (or, on a connection-opening response, "No SMTP service here") | Generic permanent failure. The text is the only detail you get. |
555 | MAIL FROM/RCPT TO parameters not recognized or not implemented | The parameter on MAIL FROM or RCPT TO is unsupported. Remove it. |
RFC 5321 is specific about the 500 and 502 split: 502 should be used when the command is recognized but not implemented, and 500 when the command is not recognized at all.
452 and 552 are not the same code
They are frequently described as if 552 had been retired in favour of 452. That is not what the spec says. Both are current, and they describe different conditions. 452 is "insufficient system storage", a server-wide problem, and it is transient. 552 is "exceeded storage allocation", the quota on that message or that mailbox, and it is permanent. A full mailbox and a full mail server are different failures with different remedies.
Which codes are not in RFC 5321?
Two: 521 and 556. Neither appears in RFC 5321's numeric list, which runs from 211 to 555. Both were added by RFC 7504 in 2015, which updates RFC 5321.
| Code | Meaning | What to do |
|---|---|---|
521 | Host does not accept mail | The host itself refuses mail, returned in response to an initial connection. |
556 | Domain does not accept mail | The destination domain does not accept mail at all. Remove the address. |
556 exists for the null MX case. When a relay can determine, without opening a connection, that the domain in a forward-pointing address does not accept mail, 556 is the appropriate reply. 521 is narrower than 554, which RFC 5321 recommends for a wider variety of refusals including mail not accepted from or for particular sources, destinations, or addresses.
This matters when reading old documentation. 555 comes from RFC 5321 in 2008. 556 comes from RFC 7504 in 2015. They are seven years and one document apart, and they are not a matched pair.
What are enhanced status codes?
The three-digit reply is coarse. RFC 3463 defines a second code that travels alongside it, in the form class.subject.detail, for example 5.1.1.
The class is restricted to three values: 2 for success, 4 for persistent transient failure, and 5 for permanent failure. No sub-code may carry a leading zero. The subject sub-code names the probable source of the problem, and it has eight defined values.
| Subject | Category |
|---|---|
X.0 | Other or undefined status |
X.1 | Addressing status, including address syntax or validity |
X.2 | Mailbox status |
X.3 | Mail system status, meaning the destination system |
X.4 | Network and routing status |
X.5 | Mail delivery protocol status |
X.6 | Message content or media status |
X.7 | Security or policy status |
The detail sub-code is the precise condition. Three worth memorising, because they cover most of what lands in a bounce log:
5.1.1Bad destination mailbox address. The mailbox in the address does not exist. RFC 3463 defines it as useful only for permanent failures. This is the classic hard bounce.4.2.2Mailbox full. The recipient exceeded a per-mailbox quota or physical capacity, and the RFC specifies it should be treated as a persistent transient failure.5.7.1Delivery not authorized, message refused. In RFC 3463 this is per-host or per-recipient filtering, and it is permanent.
Read the two codes together, not separately. The three-digit reply tells you how to behave. The enhanced code tells you why.
What do Gmail, Yahoo and Outlook actually return?
Provider behaviour is where the spec meets the real bounce log. All three publish their own references, and all three layer their own conventions on top of RFC 3463.
Gmail. Returns 450 4.2.1 when the recipient is receiving mail too quickly, 421 4.7.0 when the sending IP has no PTR record or the forward DNS does not point back to it, and 421 4.7.28 when it detects an unusual rate of unsolicited mail from an IP. 550 5.1.1 is "the email account that you tried to reach does not exist". 553 5.1.2 means the recipient domain could not be found. 552 5.2.2 is an inbox out of storage space. 550 5.4.5 is a daily sending limit. Gmail appends gsmtp to all of its error text, and gcdp when the block came from a Google Workspace administrator's custom rule.
Yahoo. Frames its bounces around two buckets. 421 and 451 are temporary problems, tied to traffic pattern, complaint rate, or busy servers, and may be retried later. 553 and 554 are permanent. Yahoo's instruction to senders is explicit: do not retry a 5xx, and remove addresses that generate 5xx bounces from the list.
Microsoft / Exchange Online. Documents the entire 5.7.0 through 5.7.999 range as a security or policy setting in the sending or receiving organization, which is consistent with RFC 3463's X.7 subject class. Microsoft also uses proprietary extended detail codes that are not in the RFC 3463 registry, such as 5.7.240 through 5.7.246, 5.1.241, and 4.4.317. A rate-limit example is 432 4.3.2, recipient thread limit exceeded, meaning the recipient mailbox is throttled for receiving too many messages too quickly.
One caveat on 4.7.0. RFC 3463 defines X.7.0 only as "other or undefined security status". The reading of 4.7.0 as a temporary rate limit or reputation block is a provider convention, Gmail's in particular, not something the RFC states.
Why SMTP codes matter for email validation
An SMTP probe asks a mail server whether it will accept a given recipient, by opening a session and issuing RCPT TO without ever sending a message. The reply code is the answer. Two common server configurations make that answer unreliable.
Catch-all servers. A catch-all, also called accept-all, is configured to return 250 for essentially any recipient at the domain, whether or not a mailbox exists behind it. A 250 from such a domain confirms that the SMTP transaction was accepted, not that the mailbox is real. Catch-all is operational terminology, not something any RFC defines, which is part of why behaviour varies. You can check whether a given domain behaves this way with our catch-all email checker.
Greylisting. A greylisting server builds a triplet from the sending IP, the envelope sender, and the envelope recipient. On first sight of a new triplet it rejects the delivery with a temporary error, on the theory that a legitimate sender will retry after the delay window and a spam sender will not. Postgrey, one of the widely deployed implementations, uses a five minute first-seen window by default. The exact reply code and text are implementation specific and not standardised, so expect a 4xx and do not build logic around one particular string.
The consequence for validation is the same in both cases. A single probe cannot always separate a valid address from an invalid one. A catch-all returns 250 for both. A greylisting server returns a 4xx for both, on the first attempt, regardless of whether the mailbox exists. Any validation result that reports a binary valid or invalid on one SMTP round trip is discarding that ambiguity rather than resolving it. Trueguard's email validation returns the ambiguous cases as ambiguous, including catch-all domains, rather than guessing.
Frequently Asked Questions
4xx is a transient negative reply: the action did not happen, the condition is temporary, and the sender should queue the message and try again. 5xx is a permanent negative reply: the sender should not repeat the same request in the same form. RFC 5321's own test is whether repeating the identical command, unchanged, could plausibly succeed later. If yes, it belongs in 4xx.
