Skip to main content
Every time an email is sent, the receiving mail server responds with an SMTP status code indicating whether the message was accepted, temporarily deferred, or permanently rejected. Lettr surfaces these codes in your dashboard and via email.bounced webhook events, so understanding them helps you diagnose delivery issues quickly.

How SMTP Response Codes Work

SMTP response codes are three-digit numbers returned by a receiving mail server during or after the message transfer. The first digit determines the overall class of the response: Modern mail servers also return Enhanced Status Codes (defined in RFC 3463) in the format x.y.z, such as 5.1.1. These provide more granular detail about the failure and are explained in a later section.

Success Codes

These codes indicate the message was accepted by the receiving server.
A 250 response means the receiving server accepted the message — it does not guarantee inbox placement. The server may still filter the message to spam or reject it at a later stage.

Temporary Failure Codes — Soft Bounces

Soft bounces are transient failures. Lettr automatically retries delivery for soft bounces according to its retry schedule. If retries are exhausted without success, the bounce may be reclassified as a hard bounce.
Lettr retries soft bounces automatically with exponential backoff. You do not need to resend these messages manually. Monitor the Activity Log in your dashboard to track retry progress.

Permanent Failure Codes — Hard Bounces

Hard bounces are definitive rejections. The receiving server will not accept this message regardless of how many times it is sent. Lettr automatically adds hard-bounced addresses to your suppression list to protect your sender reputation.
Continuing to send to hard-bounced addresses damages your sender reputation and can lead to your IP or domain being blocklisted. Lettr suppresses these addresses automatically — do not remove them from your suppression list unless you have confirmed the address is valid again.

Enhanced Status Code Structure

Enhanced Status Codes follow the format x.y.z where each component has a specific meaning:
  • x — Class (matches the first digit of the basic SMTP code)
    • 2 = Success
    • 4 = Temporary failure
    • 5 = Permanent failure
  • y — Subject category (what part of the system the issue relates to)
  • z — Detail (specific condition within that category)

Subject Categories

For example, 5.1.1 means: permanent failure (5) related to addressing (.1.) with detail code 1 (mailbox does not exist).

Provider-Specific Codes

Major mailbox providers often return custom error messages alongside standard SMTP codes. Below are common patterns you may encounter.

How Lettr Categorizes Bounces

Lettr maps raw SMTP response codes to standardized bounce categories that appear in your dashboard and in email.bounced webhook payloads. This makes it easier to take action without interpreting SMTP codes directly.
You can filter bounces by category in the Activity section of your dashboard, or use the category field in email.bounced webhook events to automate list management in your application.

Diagnosing Bounces

Step-by-step guide to investigating and resolving bounce issues.

Bounce Suppressions

How Lettr manages bounced addresses and suppression lists.

How Email Delivery Works

Understand the full email delivery pipeline from send to inbox.

Webhook Event Types

Reference for all webhook events including email.bounced payloads.