How to Debug Transactional Email Delivery Failures (Bounce, Deferral & Dropped)

When an Email "Disappears"

One of the most frustrating bug reports in SaaS is: "I clicked 'Forgot Password' and never received the email."

To a user, the email was lost. But in the world of SMTP (Simple Mail Transfer Protocol), an email is never silently lost—it is either accepted, deferred, or rejected with an exact diagnostic status code.

Understanding these codes and configuring intelligent retry handling is what separates 92% deliverability from 99.8% deliverability.


1. Decoding SMTP Response Codes

SMTP status codes follow an RFC 5321 three-digit structure:

  • 2xx: Success (e.g., 250 OK - Message accepted for delivery)
  • 4xx: Transient Failure (e.g., rate limits, graylisting, server busy)
  • 5xx: Permanent Failure (e.g., mailbox does not exist, domain blocked)

Critical 4xx Transient Codes

Receiving a 4xx error means the destination server temporarily refused the email. The sending server must NOT discard the message; it must retry later.

  • 421 4.7.0 [IP] Our system has detected an unusual rate of unsolicited mail...: Destination server is throttling your sending IP or domain.
  • 451 4.3.0 Mailbox temporarily unavailable / Graylisting: Anti-spam technique that intentionally delays first-time senders.
  • 452 4.2.2 Mailbox is full: The recipient quota is exceeded.

Critical 5xx Permanent Codes

Receiving a 5xx error means the message cannot be delivered and should never be retried:

  • 550 5.1.1 The email account that you tried to reach does not exist: Hard bounce. You must immediately add this address to your suppression list.
  • 550 5.7.1 Message rejected due to missing SPF / DKIM alignment: Authentication failure.
  • 554 5.7.1 Relay access denied: The destination MX server does not host this domain.

2. Handling Deferrals with Exponential Backoff

When an outbound worker encounters a 4xx transient code, retrying immediately will often result in an outright IP block.

SendPorter employs an exponential backoff with jitter strategy:

Attempt 1: Immediate dispatch
Attempt 2: Wait 2 minutes
Attempt 3: Wait 8 minutes
Attempt 4: Wait 30 minutes
Attempt 5: Wait 2 hours
Attempt 6: Final retry after 6 hours

If after 24–48 hours the destination server continues returning 4xx errors, the message transitions from deferred to failed, and a webhook is dispatched to your application.


3. RFC 7505: The "Null-MX" Trap

Not all domains have valid mail servers. Under RFC 7505, domains that intentionally do not accept email publish a Null MX record:

dns
example.com.  IN  MX  0  .

A naive email sender will try to resolve . as a hostname, time out after 60 seconds, and hang worker threads. SendPorter's delivery engine checks for Null-MX records immediately and rejects the send with an instant null-mx-rejected event.


4. Automatic Suppression Management

Sending repeated emails to invalid addresses destroys your sender reputation with spam filters. Modern email infrastructure requires automated suppression:

1. Hard Bounces (5xx): Automatically add to the suppression list on first failure.

2. Spam Complaints (FBL): When a recipient clicks "This is Spam" in Yahoo or Outlook, the ISP sends an Abuse Reporting Format (ARF) message. The address must be suppressed immediately.

3. Unsubscribe Requests: Honor one-click RFC 8058 List-Unsubscribe headers.

SendPorter manages suppression lists automatically per organization. Any subsequent API send to a suppressed address returns a 422 Unprocessable Entity with reason: suppressed, protecting your domain reputation before the message ever touches an external network.

Send email with parcel-like visibility.

Join developer teams using SendPorter's REST API and SMTP relay for 100% DKIM-signed delivery.

Request access