egressif.

Resources / SMTP Errors

Enhanced Status Codes (RFC 3463, 5248, 7372)

Enhanced status codes are the X.Y.Z numbers that ride alongside a basic SMTP reply and say precisely what went wrong. This page explains the class.subject.detail structure from RFC 3463, the IANA registry defined by RFC 5248, the authentication codes added by RFC 7372, and the specific codes worth recognizing.

Last checked: June 22, 2026

A basic SMTP reply tells you the verdict in one digit (2/4/5). An enhanced status code tells you why, in three numbers like 5.1.1 or 4.2.2. You see them embedded in modern replies right after the basic code:

550 5.1.1 <nobody@example.com>: Recipient address rejected: User unknown
452 4.2.2 The email account that you tried to reach is over quota

The basic code (550, 452) drives retry behavior; the enhanced code (5.1.1, 4.2.2) drives diagnosis and, downstream, bounce classification. This page covers the structure from RFC 3463 (Enhanced Mail System Status Codes, January 2003) and the registry that keeps it extensible, RFC 5248 (June 2008, BCP 138).

For the basic codes these ride on top of, see Reading SMTP replies. For how they show up inside a bounce message, see Bounces and DSN parsing.

CLASSSUBJECTDETAIL5.7.12 success4 transient5 permanent1 addressing2 mailbox7 security / policyprecise conditionwithin the subject5.7.1 = permanent, security/policy, delivery not authorized
An enhanced code splits into class.subject.detail: the class mirrors the basic verdict, the subject names where the problem is, and the detail pins the exact condition.

The 60-second version

  • An enhanced code is class.subject.detail - three dot-separated numbers, e.g. 5.7.1.
  • Class mirrors the basic first digit: 2 success, 4 persistent transient failure, 5 permanent failure. Only 2, 4, 5 are valid.
  • Subject says where the problem is: addressing (X.1.x), mailbox (X.2.x), mail system (X.3.x), network/routing (X.4.x), protocol (X.5.x), content/media (X.6.x), security/policy (X.7.x).
  • Detail is the precise condition within that subject.
  • No leading zeros, no whitespace inside the code. 5.1.1, never 5.01.01.
  • The set is extensible: RFC 3463 defined the base, RFC 5248 created the IANA registry so new codes can be added without a new core spec.

The structure: class.subject.detail

RFC 3463 §2 defines the syntax exactly:

status-code = class "." subject "." detail
class       = "2" / "4" / "5"
subject     = 1*3digit
detail      = 1*3digit

Two formatting rules from the same section that parsers must respect: “White-space characters and comments are NOT allowed within a status-code,” and “Each numeric sub-code within the status-code MUST be expressed without leading zero digits.”

The roles of the three fields: “The first sub-code indicates whether the delivery attempt was successful. The second sub-code indicates the probable source of any delivery anomalies, and the third sub-code indicates a precise error condition.”

Class - the same verdict as the basic code

ClassNameMeaning (RFC 3463 §2)
2.X.XSuccess”The DSN is reporting a positive delivery action.”
4.X.XPersistent Transient Failure”The message as sent is valid, but persistence of some temporary condition has caused abandonment or delay… sending in the future may be successful.”
5.X.XPermanent Failure”Not likely to be resolved by resending the message in the current form. Some change to the message or the destination must be made for successful delivery.”

This is the same transient-vs-permanent split as the basic 4xx/5xx. The enhanced class should agree with the basic first digit; when a provider’s text and codes disagree, the class digit is the reliable signal.

Subject - where the problem lives

SubjectNameMeaning (RFC 3463 §2)
X.0.XOther / Undefined”No additional subject information available.”
X.1.XAddressingThe originator or destination address - syntax or validity. “Can generally be corrected by the sender and retried.”
X.2.XMailbox”Something having to do with the mailbox… assumed to be under the general control of the recipient.”
X.3.XMail System”Something having to do with the destination system… under the general control of the destination system administrator.”
X.4.XNetwork and Routing”Status about the delivery system itself,” including DNS and routing infrastructure.
X.5.XMail Delivery Protocol”Failures involving the message delivery protocol,” including implementation errors or an unreliable connection.
X.6.XMessage Content or Media”Failures involving the content of the message” - translation, transcoding, unsupported media.
X.7.XSecurity or Policy”Failures involving policies such as per-recipient or per-host filtering and cryptographic operations.”

For a sender, the subject digit is the most useful field: X.1.x says fix the address, X.2.x says it is the recipient’s mailbox, X.7.x says you tripped a policy or filter.

The codes senders actually see

These are drawn from the enumerated codes in RFC 3463 §3. The “useful only for permanent / transient” notes are the spec’s own constraints and tell you whether a given detail code should ever appear as a 5.x.x or a 4.x.x.

Addressing - X.1.x (RFC 3463 §3.2)

CodeNameNote
X.1.0Other address status
X.1.1Bad destination mailbox address”Only useful for permanent failures.” The classic “user unknown.”
X.1.2Bad destination system addressThe domain part is invalid for mail. “Only useful for permanent failures.”
X.1.3Bad destination mailbox address syntax”Only useful for permanent failures.”
X.1.4Destination mailbox address ambiguousMatches more than one recipient.
X.1.5Destination address valid”Used for positive delivery reports.”
X.1.6Destination mailbox has moved, no forwarding address”Only useful for permanent failures.”
X.1.7Bad sender’s mailbox address syntax
X.1.8Bad sender’s system address

Mailbox - X.2.x (RFC 3463 §3.3)

CodeNameNote
X.2.0Other or undefined mailbox status
X.2.1Mailbox disabled, not accepting messages”May be permanent… or transient if only temporarily disabled.”
X.2.2Mailbox full”Should be used as a persistent transient failure.” (i.e. 4.2.2)
X.2.3Message length exceeds administrative limit”Should be used as a permanent failure.”
X.2.4Mailing list expansion problem”May represent a permanent failure or a persistent transient failure.”

Mail system - X.3.x (RFC 3463 §3.4)

CodeNameNote
X.3.0Other or undefined mail system status
X.3.1Mail system full”Useful only as a persistent transient error.”
X.3.2System not accepting network messagesShutdown, load, maintenance. “Both permanent and persistent transient.”
X.3.3System not capable of selected features
X.3.4Message too big for system”Useful only as a permanent error.”
X.3.5System incorrectly configured

Network and routing - X.4.x (RFC 3463 §3.5)

CodeNameNote
X.4.0Other or undefined network or routing status
X.4.1No answer from host”Useful only as a persistent transient error.”
X.4.2Bad connectionTime-out or inadequate quality. “Persistent transient.”
X.4.3Directory server failuree.g. cannot reach DNS. “Persistent transient.”
X.4.4Unable to route”Both permanent and persistent transient.”
X.4.5Mail system congestion”Persistent transient.”
X.4.6Routing loop detected”Persistent transient.”
X.4.7Delivery time expiredMessage considered too old by the rejecting system.

Protocol - X.5.x (RFC 3463 §3.6)

CodeNameNote
X.5.0Other or undefined protocol status
X.5.1Invalid commandOut of sequence or unsupported. “Only as a permanent error.”
X.5.2Syntax error”Only as a permanent error.”
X.5.3Too many recipientsMore recipients than the protocol could deliver.
X.5.4Invalid command arguments”Only as a permanent error.”
X.5.5Wrong protocol version

Security or policy - X.7.x (RFC 3463 §3.8)

CodeNameNote
X.7.0Other or undefined security status
X.7.1Delivery not authorized, message refusedPer-host or per-recipient filtering. “Only as a permanent error.”
X.7.2Mailing list expansion prohibited”Only as a permanent error.”
X.7.3Security conversion required but not possible”Only as a permanent error.”
X.7.4Security features not supported”Only as a permanent error.”
X.7.5Cryptographic failureMissing or invalid key.
X.7.6Cryptographic algorithm not supported
X.7.7Message integrity failureMessage corrupted or altered.

Message content or media - X.6.x (RFC 3463 §3.7)

CodeNameNote
X.6.0Other or undefined media error
X.6.1Media not supportedThe media of the message is not supported by either the delivery protocol or the next system in the path.
X.6.2Conversion required and prohibitedThe content must be converted to be forwarded, but conversion was prohibited.
X.6.3Conversion required but not supportedThe message content must be converted to be delivered, but no converter is available.
X.6.4Conversion with loss performedA conversion was required but only with loss; delivered anyway.
X.6.5Conversion failedA conversion was required but failed.

Senders see the X.6.x class far less often than the addressing, mailbox, and security classes above.

The IANA registry: how the set stays current (RFC 5248)

RFC 3463 fixed the structure and the initial codes, but new conditions appear over time. RFC 5248 created an IANA registry, “SMTP Enhanced Status Codes,” so codes can be added without rewriting the core spec. The registry has three tables (RFC 5248 §2.1): Class Sub-Codes, Subject Sub-Codes, and Enumerated Status Codes (a specified subject + detail with unspecified class). Each entry records the code, sample text, the associated basic SMTP code(s), a description, reference, submitter, and change controller.

New additions follow the “Specification Required” model (§2.2), “although, in practice, most entries are expected to derive from standards-track documents.” A few codes RFC 5248 itself registered (beyond RFC 3463) show how the class keeps growing:

  • X.7.10 - Encryption Needed (basic code 523)
  • X.7.13 - User Account Disabled (basic code 525)
  • X.7.14 - Trust relationship required (basic codes 535, 554)

The practical takeaway: the X.7.x security/policy class in particular is open-ended, and you will encounter detail numbers beyond the RFC 3463 list. The framework guarantees the shape (class.subject.detail) and the meaning of class and subject; specific high detail numbers should be looked up in the IANA registry, and some that providers emit are vendor extensions not yet (or never) registered there - see Bounces and DSN parsing for the provider-proprietary 421 4.7.x patterns.

Authentication failure codes (RFC 7372)

The single most useful extension to the X.7.x class for a modern bulk sender is RFC 7372 (Email Authentication Status Codes, Standards Track, 2014), which registered codes to say that a message was rejected or deferred specifically because of an authentication failure - SPF, DKIM, or reverse DNS - rather than a generic policy block. Before these, a receiver could only fall back to a vague 5.7.1 or 5.7.0. The six registered codes:

CodeSample textBasic codeWhat it means
X.7.20No passing DKIM signature found550The message carried no DKIM signature that passed verification.
X.7.21No acceptable DKIM signature found550A DKIM signature passed, but none met the receiver’s local requirements.
X.7.22No valid author-matched DKIM signature found550A signature passed but none align with the From: author domain (a special case of X.7.21).
X.7.23SPF validation failed550An SPF check produced a fail contrary to local policy. Used in place of 5.7.1 (RFC 7208 §8.4).
X.7.24SPF validation error451 / 550SPF evaluation hit an error. Used in place of 4.4.3 or 5.5.2 (RFC 7208 §8.6-8.7).
X.7.25Reverse DNS validation failed550The client IP failed a reverse-DNS check, contrary to local policy.
X.7.26Multiple authentication checks failed550More than one authentication method failed; the specific ones are unspecified.

Two operator notes straight from RFC 7372. First, when several checks fail, “the SMTP server SHOULD use the code that indicates multiple methods failed [X.7.26] rather than only reporting the first one that failed.” Second, these codes exist partly for “mailing list software, which processes rejections in order to remove… addresses that are no longer valid” - the point is to “distinguish authentication failures from indications that the recipient address is no longer valid.” That distinction matters for suppression: a 5.7.23 is your authentication problem to fix (see DMARC and alignment), not a dead recipient to suppress.

Note X.7.24 is the one auth code with a dual basic-code mapping (451 or 550): an SPF error can be transient (a DNS timeout, 4xx) or treated as permanent (5xx) depending on the receiver’s policy, so read the basic class to decide whether to retry.

A consolidated view of the X.7.x security and policy class

Because the security/policy class is where senders meet reputation and authentication, it is worth seeing the registered detail codes in one place - RFC 3463 base, RFC 5248 additions, and RFC 7372 auth codes:

CodeNameSource
X.7.0Other or undefined security statusRFC 3463
X.7.1Delivery not authorized, message refusedRFC 3463
X.7.2Mailing list expansion prohibitedRFC 3463
X.7.3Security conversion required but not possibleRFC 3463
X.7.4Security features not supportedRFC 3463
X.7.5Cryptographic failureRFC 3463
X.7.6Cryptographic algorithm not supportedRFC 3463
X.7.7Message integrity failureRFC 3463
X.7.10Encryption neededRFC 5248
X.7.13User account disabledRFC 5248
X.7.14Trust relationship requiredRFC 5248
X.7.20No passing DKIM signature foundRFC 7372
X.7.21No acceptable DKIM signature foundRFC 7372
X.7.22No valid author-matched DKIM signature foundRFC 7372
X.7.23SPF validation failedRFC 7372
X.7.24SPF validation errorRFC 7372
X.7.25Reverse DNS validation failedRFC 7372
X.7.26Multiple authentication checks failedRFC 7372

This is not the entire IANA registry - it also holds additional X.7.x codes contributed by other standards-track documents (for example, the SMTP AUTH extension registers its own authentication-credential codes) - but it covers what a deliverability operator routinely encounters. For any code outside this set, the authoritative source is the live IANA SMTP Enhanced Status Codes registry, not a guess from the number.

How basic and enhanced codes line up

RFC 5248 §2.4 publishes the mapping between basic SMTP codes and enhanced codes. A selection:

Enhanced codeAssociated basic codes (RFC 5248 §2.4)
X.1.1451, 550
X.1.3501
X.1.5250
X.2.2552
X.2.4450, 452
X.3.1452
X.3.4552, 554
X.4.1451
X.4.2421
X.4.3451, 550
X.5.3451
X.7.1451, 454, 502, 503, 533, 550, 551
X.7.2550
X.7.4504
X.7.23 (RFC 7372)550
X.7.24 (RFC 7372)451, 550
X.7.26 (RFC 7372)550

Note that one enhanced code can map to several basic codes and vice versa - the two systems are related but not one-to-one. Read both: the basic class for retry behavior, the enhanced subject/detail for the reason.

Common confusion

  • Class must agree with the basic code. A 5.x.x enhanced code on a 4xx basic reply (or the reverse) is contradictory; trust the basic class for retry decisions and treat the message as suspect.
  • X is a placeholder, not a literal.X.2.2 mailbox full” appears in the wild as 4.2.2 (transient) per the spec’s own guidance; the leading digit is filled in by the actual class.
  • Higher detail numbers are not “more severe.” Detail is just an index within a subject, not a severity ranking.
  • Not every enhanced code is in RFC 3463. The IANA registry (RFC 5248) is the live source; provider-specific detail codes may not be registered at all.

What this means for you, and what Egressif does

Egressif keys bounce handling on the enhanced code when one is present, falling back to the basic class when it is not. The class digit decides retry-vs-suppress (same 4/5 logic as the basic reply), and the subject digit decides what to tell you: an X.1.1/X.1.2 is a dead address we suppress, an X.2.2 is a transient full mailbox we retry, and an X.7.x is a policy or filtering signal that usually points at reputation or authentication rather than the recipient. The RFC 7372 auth codes (X.7.20-X.7.26) are especially actionable: they say “fix SPF/DKIM/DMARC,” not “this recipient is gone,” so we route them to authentication monitoring instead of the suppression list. We look up unfamiliar X.7.x detail codes against the IANA registry (RFC 5248) rather than guessing, and we treat the codes as diagnosis, never as a placement guarantee - no status code, basic or enhanced, can promise the inbox.

Tell us what you run today.

Domains, rough volume, current providers, and what hurts. You will get a straight answer on fit, and a real number, in one conversation.

Talk to our team