How SMTP error codes are built
A bounce usually carries two codes and a sentence, like 550 5.1.1 The email account that you tried to reach does not exist.
- The basic reply code (
550) comes from SMTP itself, RFC 5321. The first digit says how it went:2success,3send more,4temporary failure,5permanent failure. The second digit is the category (5is about the mail system or mailbox) and the third narrows it down. - The enhanced status code (
5.1.1) comes from RFC 3463 and reads as class.subject.detail. The class repeats the first digit (4or5). The subject says what kind of problem it is:1addressing,2mailbox,3mail system,4network and routing,5protocol,6content,7security and policy. The detail is the specific reason, registered with IANA. - The text is written by the receiving server and is often the most useful part. Gmail, Microsoft and Yahoo publish what theirs mean.
4xx vs 5xx, soft vs hard bounces
| 4xx (temporary) | 5xx (permanent) | |
|---|---|---|
| Meaning | Not now; try again later | No; sending the same thing again won't work |
| Examples | 421 4.7.0 try again later, 450 mailbox busy, 452 4.2.2 mailbox full | 550 5.1.1 user unknown, 550 5.7.1 refused, 554 5.7.1 transaction failed |
| Often called | Soft bounce or deferral | Hard bounce |
| What the sending server does | Queues and retries for hours or days | Gives up and sends a bounce |
Common SMTP error codes
| Code | Meaning | About | What to do |
|---|---|---|---|
| 550 5.1.1 | Bad destination mailbox (user unknown) | Address | Suppress |
| 550 5.1.10 | Recipient not found (Microsoft 365) | Address | Suppress |
| 550 5.2.1 | Mailbox disabled or inactive | Address | Suppress |
| 552 5.2.2 | Mailbox full | Address | Retry later; suppress if it persists |
| 550 5.7.1 | Delivery not authorized, message refused | Sender | Fix the cause in the text |
| 554 5.7.1 | Transaction failed: relay denied, blocklist, policy | Sender | Fix the cause in the text |
| 550 5.7.26 | Multiple authentication checks failed (Gmail: unauthenticated or DMARC) | Sender | Fix SPF, DKIM, DMARC |
| 550 5.7.25 | Reverse DNS (PTR) check failed | Sender | Add a PTR record for the sending IP |
| 550 5.7.509 | DMARC failed with p=reject (Microsoft) | Sender | Fix DMARC alignment |
| 550 5.7.515 | Authentication level not met (Outlook.com) | Sender | Pass SPF, DKIM and DMARC |
| 421 4.7.0 | Try again later; often reputation or missing PTR (Gmail) | Sender | Slow down; the server retries |
| 421 4.7.28 | Unusual rate of mail (Gmail) | Sender | Reduce volume spikes; the server retries |
| 535 5.7.8 | Authentication credentials invalid | Your SMTP login | Fix the username or password |
| 550 permanent failure | Generic permanent refusal | Depends | Read the enhanced code and text |
| SPF PermError | SPF record can't be evaluated | Sender | Fix the SPF record |
Meanings from RFC 3463, RFC 7372, Google, Microsoft and Yahoo. Linked codes have their own page.
How Groundmail handles bounces
- Temporary (4xx) replies are retried by the mail server. You get an
email.delivery_delayedwebhook while it does. - Hard bounces (
bounce_type: "hard"): the address can't receive mail. It's suppressed automatically, and later sends to it return422instead of bouncing again. - Block bounces (
bounce_type: "block"): the receiver refused the sender for reputation or policy. The address is not suppressed and the bounce doesn't count toward your bounce rate. - Every bounce keeps the receiver's full reply in
bounce_reason, on the email and on theemail.bouncedwebhook.
Before a send goes out, Groundmail validation also holds back addresses that can't receive mail, such as domains with no mail server, so many hard bounces never happen. Details are in the emails and suppressions docs.
Tools for diagnosing bounces
- SPF checker, DKIM checker and DMARC checker for authentication failures.
- Blocklist checker for refusals that name a list or reputation.
- Email header analyzer to read
Authentication-Resultson a delivered copy. - MX lookup when every address at one domain bounces.
Frequently asked questions
What's the difference between a 4xx and a 5xx SMTP error?
A 4xx reply is temporary: the receiving server is asking you to try again later, and the sending server retries automatically. A 5xx reply is permanent: the same message won't be accepted if you resend it.
What is an enhanced status code?
The X.Y.Z code after the 3-digit reply, defined in RFC 3463. X is the class (4 temporary, 5 permanent), Y the subject (1 addressing, 2 mailbox, 7 security or policy, and so on) and Z the specific detail.
What's the difference between a soft bounce and a hard bounce?
A soft bounce is a temporary failure, usually a 4xx reply, which the sending server retries. A hard bounce is a permanent failure, a 5xx reply. Among hard bounces, a 5.1.x code means the address is bad and should be suppressed, while a 5.7.x code usually means the sender was refused and the address is fine.
Should I remove an address after a bounce?
Only when the bounce is about the address: unknown user, mailbox disabled, domain with no mail server. Refusals for policy, reputation or authentication are about the sender; fix the cause and keep the address.
Why does my bounce say 550 permanent failure with no detail?
Some sending systems summarise every 5xx as a permanent failure. The full bounce or your provider's logs should include the receiving server's own code and text, which is what tells you the cause.
Sources
Code meanings come from the SMTP standards; receiver-specific wording from each mailbox provider's published documentation.
- RFC 5321: Simple Mail Transfer Protocol (reply codes, section 4.2)
- RFC 3463: Enhanced Mail System Status Codes
- RFC 7372: Email Authentication Status Codes
- IANA: SMTP Enhanced Status Codes registry
- Google: Gmail SMTP errors and codes
- Microsoft: NDRs and SMTP errors in Exchange Online
- Yahoo Sender Hub: SMTP error codes