Email Sent vs Delivered: What Each Status Actually Proves
Sent and delivered are not interchangeable email statuses. Queued means a sender has accepted work. A successful SMTP handoff means another server accepted responsibility. A delivery notification can report delivery to an address. A displayed notification can report that a mail app showed the message to someone.
None of those states proves inbox placement, readership, identity, or future reachability.
I treat each status as evidence from one boundary. That makes the labels less impressive, but much more useful when a receipt is missing or an account email arrives late.
The status ladder, from weakest to strongest
The same word can mean different things in two dashboards. Instead of trusting the label, ask which system produced the event and what that system observed.
| Status | What was actually observed | What remains unknown |
|---|---|---|
requested |
Your application created a send request. | Whether the sender accepted, attempted, or transmitted it. |
queued |
The sending system stored work for a later attempt. | Whether any connection to the recipient domain has occurred. |
sent |
A provider-specific sending milestone occurred. | The exact boundary, unless the event includes the SMTP reply or equivalent evidence. |
remote_accepted |
The receiving SMTP server returned a successful completion reply after the message data. | Whether the message reached a mailbox, folder, inbox, or person. |
delivered in a DSN |
The reporting mail server says delivery to the recipient address completed. | Whether a person read it. Delivery can also mean delivery to a mailing-list exploder. |
displayed in an MDN |
A mail user agent reports that it displayed the message to someone using the mailbox. | Whether the intended person read or understood the content. |
The transport meanings come from the standards, not dashboard colors. RFC 5321 defines the responsibility handoff at the successful end of an SMTP transaction. RFC 3464 defines DSN actions such as delayed, failed, delivered, relayed, and expanded. RFC 8098 defines message disposition notifications, including displayed.
The important 250 is after DATA
An SMTP session contains more than one positive reply. A receiving server might return 250 after MAIL FROM and RCPT TO, then reject the complete message after inspecting its data.
C: MAIL FROM:<bounces@example.test>
S: 250 2.1.0 Sender OK
C: RCPT TO:<person@example.net>
S: 250 2.1.5 Recipient OK
C: DATA
S: 354 End data with <CRLF>.<CRLF>
C: ...message headers and body...
C: .
S: 250 2.0.0 Accepted for delivery
The final reply is the meaningful handoff. RFC 5321 says that a server sending a positive completion reply after the end of the message data takes responsibility for delivering the message or properly reporting a later failure.
That is stronger than “our worker called the mail library.” It is still not an inbox receipt. The accepting server may be a relay, gateway, mailing-list system, filtering layer, or final destination.
A timeout at this boundary is ambiguous. The receiver may have stored the message while the sender missed the reply. Retrying without an idempotency plan can create duplicates. The email API versus SMTP guide covers that handoff problem in detail.
Store evidence per recipient, not one message boolean
One message can have three recipients and three outcomes. One address may be accepted, another deferred, and a third rejected during the same delivery attempt.
I would keep three separate fields for each recipient:
- Transport: requested, queued, attempting, or remote accepted.
- Delivery outcome: pending, delayed, delivered, relayed, expanded, or failed.
- Disposition: unknown, displayed, dispatched, processed, or deleted.
This prevents a weak event from overwriting a stronger but different kind of evidence. It also preserves a valid sequence such as remote acceptance followed by a later failure notification.
Here is a hypothetical normalized event:
{
"message_id": "msg_01HYPOTHETICAL",
"recipient": "person@example.net",
"event": "remote_accepted",
"occurred_at": "2026-11-10T03:58:12Z",
"source": "smtp",
"smtp_reply": "250 2.0.0 Accepted for delivery",
"terminal": false
}
The event is not a claim that the mailbox exists forever or that the message reached the primary inbox. It records one observed handoff. Keep the raw reply beside the normalized state so an operator can inspect the evidence later.
Later events should add evidence, not rewrite history
A delayed DSN does not erase the fact that the message was previously accepted. It says the reporting server has not completed delivery and intends to keep trying. A failed DSN records a terminal outcome for that recipient. A delivered DSN is also terminal for that recipient, but it does not mean read.
When events arrive through webhooks, deduplicate them before changing state. Keep the provider event ID when one exists, and otherwise use a stable fingerprint over the delivery, recipient, event type, and source timestamp. Do not let a late queued event turn a failed recipient back into pending.
For failure handling, preserve the enhanced status and diagnostic text rather than collapsing everything into hard or soft. The hard bounce versus soft bounce guide shows how DSN evidence should change send policy, while the suppression-list model keeps that policy scoped to the right message class.
“Delivered” is still not “in the inbox”
There is a fair objection: if the receiving system accepted the message, why not show users a simple green “Delivered” badge?
Because most users read that badge as “the person got it.” Your evidence may only say “the recipient server accepted responsibility.” Spam filtering, mailbox rules, forwarding, quarantine, aliases, and list expansion can all happen after that boundary.
If remote SMTP acceptance is the strongest evidence you have, label it accepted by recipient server. Use delivered when the event source and documentation support that state. If an MDN says displayed, keep the wording equally narrow. RFC 8098 explicitly says display does not guarantee the content was read or understood.
A tracking pixel is weaker still. An image request can come from a proxy, privacy feature, or automated scanner. The tracking-pixel guide explains why an open event is not a human-read receipt.
Pre-send verification belongs on a different axis
Email verification happens before sending. It helps decide whether an address is structured correctly, appears routable, carries a risk signal, or returns conclusive mailbox evidence. It does not predict every later transport event.
The current emailverifier.dev API keeps deliverable, risky, undeliverable, and unknown separate from its allow, review, or block recommendation. Those are address decisions, not message-delivery receipts.
A deliverable address can bounce later. An unknown result can receive a message. The verified-address bounce guide explains why those observations can both be honest.
For your own product UI, name the evidence instead of compressing the story into one green check: queued by us, accepted by the recipient server, DSN-delivered, or displayed notice received. The truthful label is sometimes longer. It also tells you which system to debug.