If an email says delivered but not received, the sending system probably completed its last visible handoff successfully. That is useful evidence, but it is not the same as proof of inbox placement, mailbox availability, or a human reading the message.

The fastest way to resolve this problem is to stop treating “delivered” as a single universal outcome. Identify exactly which mail server accepted the message, inspect the SMTP response and message headers, then work outward through spam filtering, quarantine, mailbox rules, forwarding, authentication, and recipient-side administration.

What “delivered” actually means in email systems

Email travels through several independent systems. Your application submits a message through an email API or SMTP relay. The sending provider queues it, looks up the recipient domain’s MX records, connects to a receiving mail server, and attempts delivery. The recipient’s mail environment may then scan, route, quarantine, archive, forward, or silently filter the message.

Most providers use delivered to mean that the recipient’s receiving mail server accepted the message during SMTP delivery. In an SMTP conversation, that normally means the remote server returned a successful 250 response after the message content was transmitted. A typical final response looks like this:

250 2.0.0 OK: queued as 123ABC456

That response is strong evidence that the destination infrastructure accepted responsibility for the message. It does not prove all of the following:

  • The email landed in the Inbox rather than Spam, Junk, Promotions, Updates, Archive, or a custom folder.
  • The recipient’s anti-spam or security product did not quarantine it after SMTP acceptance.
  • A mailbox rule, forwarding rule, transport rule, or retention policy did not move or remove it.
  • The address belongs to the intended person.
  • The recipient opened, read, or even saw the email.

This distinction matters when debugging application notifications, password resets, receipts, invitations, and other transactional messages. Your sending service can accurately report successful handoff while the recipient still experiences the message as missing.

The delivery chain has more than one finish line

A useful mental model is to separate email processing into five stages:

  1. Application acceptance: Your REST API request or SMTP submission was accepted by the sending provider.
  2. Provider processing: The provider rendered the message, applied suppression rules, signed it where configured, and queued it.
  3. Remote SMTP acceptance: The recipient domain’s mail exchanger accepted the message with a 2xx SMTP response.
  4. Recipient-side processing: The receiving system ran malware scanning, anti-spam checks, mail-flow rules, journaling, routing, and mailbox delivery.
  5. User visibility: The message appeared somewhere the intended recipient can find and access it.

A status labelled “sent” often confirms stage 1 or 2. A status labelled “delivered” often confirms stage 3. The recipient’s statement that they did not receive it is usually a problem in stage 4 or 5, although earlier problems can be hidden by misleading logging, duplicate message handling, or incorrect recipient data.

Start with the event timeline, not the recipient’s inbox

Before changing DNS records, resending the message, or blaming a mail provider, gather the evidence for one specific message. Troubleshooting is much faster when everyone investigates the same immutable identifiers and timestamps.

Record these values from your application logs and sending provider events:

  • Recipient address exactly as submitted.
  • Envelope sender, also called MAIL FROM or return-path domain.
  • Visible From: address and domain.
  • Subject line and approximate message body.
  • Submission timestamp in UTC.
  • Provider message ID or API request ID.
  • RFC 5322 Message-ID header, if available.
  • Final event type, timestamp, remote host, and SMTP reply.
  • Any later bounce, complaint, deferred, rejected, or suppressed event.

For API-based delivery, keep the provider’s returned message identifier and correlate it with your own order ID, user ID, password-reset token ID, or notification ID. For SMTP relay, log the relay response and your local queue ID. This makes it possible to distinguish a real delivery issue from an application bug that sent the email to the wrong address or never generated the intended content.

If your provider supports webhooks, store raw delivery and bounce payloads. Do not reduce a delivery event to a boolean like emailDelivered = true; preserve the event timestamp, recipient, SMTP code, enhanced status code, response text, and provider message ID. Those details are often the only evidence available after a recipient’s security team deletes a quarantined message.

Confirm the exact recipient first

Many apparent deliverability incidents are data-quality problems. A user may have entered an old work address, a typo, an alias that routes elsewhere, or a shared mailbox that nobody checks. A CRM import may have included whitespace, stale values, or a mismatched contact record.

Check the recipient used for the envelope command, not just the value displayed in your product UI. SMTP sends to the envelope recipient in RCPT TO, which can differ from the visible To: header. This matters for mailing lists, BCC messages, forwarding services, and applications that render recipient headers separately from actual delivery targets.

Validate addresses before important sends, particularly for sign-up flows, invitations, and high-volume notification lists. A free email address verification tool can help catch malformed domains and obvious address issues, but verification cannot guarantee that a person actively uses a valid mailbox.

Read the SMTP response and enhanced status code

SMTP replies are more valuable than generic status labels. The first digit of the SMTP reply indicates the broad result:

  • 2xx: successful command completion.
  • 4xx: temporary failure; retrying later may work.
  • 5xx: permanent failure for that attempt; do not blindly retry unchanged.

Enhanced status codes add detail in the form X.Y.Z. The first digit again represents the class: 2 is success, 4 is temporary failure, and 5 is permanent failure. For example, 250 2.0.0 is generally successful acceptance, while 550 5.1.1 commonly indicates an invalid or unavailable recipient mailbox.

Common responses and what they mean

ResponsePractical interpretationWhat to do
250 2.0.0The receiving server accepted the message.Investigate recipient-side placement, filtering, and mailbox rules.
250 2.6.0The message was accepted, often with content-related success information.Still inspect headers and recipient-side filtering if it is not visible.
421 4.7.0Temporary deferral, often reputation, rate, or policy related.Let the queue retry; reduce volume or fix authentication if persistent.
450 4.2.0Temporary mailbox or system condition.Retry according to queue policy; contact recipient admin if it persists.
451 4.7.1Temporary policy, anti-spam, or processing issue.Review the full diagnostic text and sending reputation.
550 5.1.1Recipient mailbox is unavailable or does not exist.Suppress the address and request a corrected one.
550 5.7.1Message rejected due to policy, authentication, or permissions.Inspect SPF, DKIM, DMARC, content, IP reputation, and recipient policy.
554 5.7.1Message rejected for policy reasons.Treat the text as provider-specific evidence; resolve the cited policy issue.

Do not interpret the text after the code in isolation. Human-readable diagnostic strings vary by receiving system and can change without notice. Store the complete response, but classify failures primarily by the SMTP reply, enhanced status code, and retry outcome.

A true remote 250 means the sending system should generally not continue retrying that recipient. Repeatedly resending after a recipient server accepted the original may create duplicates if the issue is only inbox placement or a delayed internal routing process.

Check Spam, Junk, quarantine, and every mailbox view

When the remote server accepted the message, the first recipient-side check should be broader than “look in the inbox.” Modern mail systems categorize, filter, and sometimes hide mail in several places.

Ask the recipient to search All Mail or the equivalent global mailbox search for:

  • The exact sender address or sending domain.
  • A distinctive word from the subject.
  • The message ID, if their client exposes headers.
  • A narrow time range around the delivery timestamp.
  • The visible From: display name and the actual address separately.

They should check Inbox, Spam or Junk, Promotions, Updates, Archive, Deleted Items, and every custom folder. On mobile clients, ensure they are viewing the correct account and not a filtered “Focused,” “Priority,” or category view.

Quarantine can look like disappearance

Corporate recipients often have security products that accept mail at the gateway and then quarantine it before it reaches the mailbox. Microsoft 365 environments may use Exchange Online Protection or Defender policies. Google Workspace environments can apply Gmail protections and organization-level compliance rules. Other businesses may put a secure email gateway, archive, or data-loss prevention system in front of their mailboxes.

A recipient may not receive a quarantine digest, may have digest messages disabled, or may lack permission to release a message. In those cases, the recipient needs their email administrator to search message tracking, quarantine, gateway logs, or security-event records using the sender, recipient, subject, and timestamp.

The important question for the administrator is not merely “Did it arrive?” Ask: Was the message accepted, quarantined, routed, dropped by a rule, delivered to a mailbox, or redirected elsewhere? Those are distinct states.

Inbox rules and forwarding create false negatives

A recipient mailbox may have rules that automatically move messages based on sender, subject, keywords, category, or authentication results. A forwarding rule can send mail to another address, while a delete rule can make the original message hard to locate. Shared mailboxes add another complication: the mail may be visible only to members who have opened the shared mailbox or who have the right client permissions.

For persistent one-recipient incidents, ask the recipient’s administrator to inspect mailbox inbox rules, transport rules, forwarding configuration, blocked-sender lists, safe-sender lists, and retention policies. If the issue affects multiple recipients at the same company, investigate the organization’s mail gateway before treating each mailbox as an isolated problem.

Inspect the full message headers when you can get a copy

Headers document the route a message took and provide evidence about authentication. If a recipient finds the message in Junk, quarantine, or another folder, ask for the full original source or full headers—not a screenshot of the email body.

Look for these fields:

Message-ID: <abc123@example.com>
Return-Path: <bounce@example.com>
From: Example App <notifications@example.com>
To: recipient@recipient.example
Received: from ...
Authentication-Results: ...
DKIM-Signature: ...

The Received: headers are added as the message passes through servers. Read them from bottom to top to reconstruct the route from sender toward recipient. The topmost Received: header is usually closest to the mailbox delivery system, while lower entries describe earlier hops.

Authentication-Results: is especially useful. A successful result may resemble:

Authentication-Results: mx.recipient.example;
       spf=pass smtp.mailfrom=bounce.example.com;
       dkim=pass header.d=example.com;
       dmarc=pass header.from=example.com

The exact layout varies by receiver. A failure may show spf=fail, dkim=fail, dmarc=fail, or an alignment failure. Passing authentication does not guarantee inbox placement, but failing it can significantly increase the chance of rejection, spam placement, or quarantine.

Compare a working and missing message

If some emails reach the same recipient domain and others do not, compare headers from a known-good message with a missing or spam-folder message. Check:

  • From: domain and display name.
  • Return-path or envelope sender domain.
  • DKIM signing domain in d=.
  • SMTP sending host or IP range.
  • Whether SPF, DKIM, and DMARC passed.
  • Subject structure, URLs, attachment type, and HTML complexity.
  • Presence of list headers such as List-Unsubscribe.
  • Time of day, send rate, recipient segment, and template version.

This comparison often reveals an overlooked difference: a new subdomain, a different sending stream, a changed link domain, an unconfigured return-path, or an attachment that triggered a gateway policy.

Verify SPF, DKIM, and DMARC alignment

Authentication is not a cosmetic DNS task. It connects your visible sender identity to the infrastructure that actually sends mail. Major mailbox providers expect authenticated mail, and authentication failures make “delivered but missing” incidents more likely to become inbox-placement or quarantine problems.

SPF: authorize the envelope sender

SPF is a DNS TXT record that identifies hosts allowed to send mail for a domain. The receiving server evaluates SPF against the envelope sender domain, not necessarily the visible From: domain.

A syntactically valid illustrative SPF record is:

example.com. IN TXT "v=spf1 ip4:192.0.2.10 -all"

Another common structure delegates authorization to a sending provider:

example.com. IN TXT "v=spf1 include:spf.sender.example -all"

Use the exact include domain supplied by your email provider; do not copy the placeholder above. Publish one SPF TXT record per domain. Multiple SPF records can cause a permerror, which is not the same as passing SPF.

Also account for every legitimate sender: your transactional provider, support desk, Google Workspace or Microsoft 365, marketing platform, invoice system, and any server that sends as the same envelope domain. SPF has DNS lookup limits, so piling on includes without reviewing the final record can cause failures.

DKIM: cryptographically sign the message

DKIM signs selected headers and body content with a private key. The receiver retrieves the matching public key from DNS using the selector named in the signature.

A DKIM DNS record is published at a hostname shaped like this:

selector1._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=BASE64_PUBLIC_KEY"

The real p= value must be the complete public key generated for your sender; BASE64_PUBLIC_KEY is only a placeholder. Your sending provider normally gives you the exact selector and TXT value, or signs with a configured domain after DNS verification.

In a header, look for a signature like:

DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=selector1; ...

The d= domain is the DKIM signing domain and s= is the selector. If the receiver reports dkim=pass, it verified that signature. If it reports dkim=fail, check that the DNS key exists, matches the private key in use, has not been truncated by the DNS interface, and that no system modified signed content in a way that invalidated the signature.

DMARC: align authentication with the visible From domain

DMARC evaluates whether SPF or DKIM passed and aligned with the domain visible in the From: header. A basic monitoring policy looks like this:

_dmarc.example.com. IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com"

A stricter policy might use p=quarantine or p=reject, but do not change to enforcement until you understand all legitimate sending sources. An overly aggressive DMARC policy can break mail sent by systems you forgot to authenticate.

For alignment, it is not enough that some unrelated provider domain passes SPF. If the visible sender is notifications@example.com, you generally want the aligned SPF domain and/or DKIM d= domain to match example.com or an allowed aligned subdomain. This is why a message can show SPF pass but still have DMARC fail.

Use DNS inspection tools such as MXToolbox, dig, nslookup, or your DNS provider’s record viewer to verify published records. Send test messages to mail-tester.com or controlled Gmail and Outlook test mailboxes, then inspect the authentication results rather than relying only on a dashboard’s domain-verification badge.

For implementation details specific to your sender, consult the email API setup guides and use the exact DNS values supplied for your account.

Diagnose reputation, content, and sending-pattern problems

A message can authenticate correctly and still be filtered. Receiving systems evaluate many signals beyond SPF, DKIM, and DMARC: sender reputation, IP reputation, historical engagement, spam complaints, bounce rates, link reputation, message structure, volume spikes, and recipient-specific policies.

Why one transactional message can be filtered

Transactional email is usually wanted, but recipients and filters do not automatically know that. A password-reset message can be suspicious if it comes from a newly configured domain, uses a mismatched display name, contains a newly registered tracking domain, or resembles a phishing template.

Review these risk factors:

  • A sudden increase in send volume from a new domain or IP.
  • Sending to old, unengaged, purchased, or unverified addresses.
  • High hard-bounce or complaint rates.
  • A visible From: domain that differs from the signed domain.
  • URL shorteners, unrelated tracking domains, or destination links with poor reputation.
  • Image-only emails, malformed HTML, hidden text, or excessive redirects.
  • Attachments that are blocked by recipient policy.
  • Reusing identical content across large numbers of recipients without clear transactional context.

Do not try to “fix” deliverability by adding spammy phrases, randomizing copy, or repeatedly changing the sender name. Those tactics obscure the real cause and can weaken user trust. Instead, make the sender identity stable, authenticate the domain, keep content purposeful, and separate distinct message types when appropriate.

Separate transactional and marketing streams

A product’s password resets, receipts, account alerts, and onboarding messages often have different risk profiles from newsletters and promotional campaigns. Mixing them on the same sending identity can make operational email vulnerable to marketing complaints or poor engagement.

Where your provider supports it, use deliberate stream separation: distinct subdomains, return-path domains, DKIM selectors, and sending configurations for transactional versus marketing traffic. The visible From: identity should remain recognizable to users, and your authentication strategy should preserve DMARC alignment.

For example, a company might use notify.example.com for application notifications and news.example.com for newsletters, while still presenting a clear branded sender. This is not a guarantee of inbox placement, but it creates cleaner reputation boundaries and more useful troubleshooting data.

Rule out application-level and API integration mistakes

Not every delivery report corresponds to the email the user expected. Your integration may have generated a successful message—but with stale content, a different recipient, a duplicate template, or an old event payload.

Check the application workflow from trigger to send:

  1. Confirm the business event occurred exactly once.
  2. Confirm the application selected the intended recipient record.
  3. Log the destination address after all template variables and routing logic are resolved.
  4. Associate the provider message ID with the internal event ID.
  5. Confirm the expected subject and template version were rendered.
  6. Check whether a retry worker or idempotency bug sent duplicates.
  7. Verify that sandbox, test, suppression, or allowlist rules did not alter the outcome.

For REST API sends, a successful HTTP response means the API accepted your request; it is not necessarily remote mail delivery. A typical asynchronous API pattern is 202 Accepted, which means the server accepted the request for processing. Follow subsequent event data to learn whether the message was later delivered, deferred, bounced, or suppressed.

For SMTP relay, distinguish the response from your email provider’s relay from the response that relay later receives from the recipient’s mail system. Your application may receive 250 when the relay accepts the message into its queue, while the provider later encounters a temporary 421 or permanent 550 at the destination. This is why provider event timelines and webhook records are essential.

Know when the recipient’s administrator must investigate

Once you have a remote acceptance event and clean authentication results, the recipient organization owns much of the remaining evidence. Their administrator can see controls that senders cannot: internal message trace, gateway actions, tenant-wide policies, mailbox rules, quarantine state, and compliance workflows.

Send a concise escalation package instead of a vague request to “check your spam filter.” Include:

Sender: notifications@example.com
Envelope sender: bounce@example.com
Recipient: person@recipient.example
Subject: Your password reset link
UTC delivery time: 2026-08-12 14:03:27 UTC
Message-ID: <abc123@example.com>
Remote SMTP result: 250 2.0.0 accepted
Authentication: SPF pass, DKIM pass, DMARC pass

Ask the administrator to search their logs around that timestamp and determine whether the message was accepted at the gateway, quarantined, delivered to a mailbox, redirected by a rule, or rejected during internal processing. If a security policy blocked it, request the specific policy name or diagnostic reason rather than asking for a permanent allowlist immediately.

An allowlist can solve a narrow emergency, but it should not become the only deliverability strategy. Broad allowlisting reduces protection for the recipient organization and does not fix misalignment, weak reputation, compromised accounts, or unsafe content.

Use a repeatable test matrix

Testing one message to one inbox can produce misleading conclusions. Instead, create controlled test recipients across major mailbox ecosystems and compare results over time.

A practical test matrix includes:

  • One Gmail consumer mailbox.
  • One Outlook.com or Microsoft-hosted mailbox.
  • One Google Workspace mailbox, if available.
  • One Microsoft 365 mailbox, if available.
  • One corporate recipient behind a security gateway, if relevant to your customers.
  • One mailbox you fully control for collecting raw headers.

Send the same minimal test email to each recipient. Use a stable sender, a simple subject, a single plain URL on your own domain, and no attachment. Then test the production template separately. This tells you whether the issue is broad sender reputation, a specific recipient domain, or template-specific filtering.

Keep a record of the test date, sending stream, visible From domain, envelope domain, DKIM domain, status event, destination folder, and header results. Repeat after DNS changes, provider migrations, major template revisions, or new sending-domain launches.

Avoid the troubleshooting mistakes that make things worse

Several common responses to missing email problems create more confusion or more filtering.

Do not resend repeatedly without changing the diagnosis

If the first message was accepted and then quarantined or moved to Junk, repeatedly sending the same message can increase recipient frustration and create duplicate notifications. For time-sensitive workflows, provide a safe alternative channel such as an in-app notification, a one-time recovery screen, or customer support verification—but preserve security controls for sensitive actions.

Do not change SPF, DKIM, and DMARC blindly

Authentication records are interdependent with your mail architecture. Replacing an SPF record can accidentally remove authorization for another legitimate sender. Enforcing a strict DMARC policy before all sources align can cause widespread rejection. Make changes from evidence, document every sender, and test DNS propagation before sending production traffic.

Do not treat a lack of bounce as proof of inbox delivery

A missing bounce only means you have not received a usable non-delivery report. Some systems accept and filter messages internally, some suppress DSNs, and some failures are reported asynchronously or not at all. A 250 acceptance is stronger evidence than no bounce, but even it stops short of proving inbox placement.

Do not expose sensitive message content in support tickets

Headers are usually safe to share after review, but password-reset links, invoices, personal data, access tokens, and full message bodies may not be. Redact secrets and use message IDs, timestamps, and authentication outcomes whenever possible.

A practical decision tree for “delivered but not received”

Use this sequence to avoid random changes:

  1. Verify recipient data. Confirm the exact envelope recipient and check for stale or mistyped addresses.
  2. Locate the final delivery event. Was it provider acceptance, remote SMTP acceptance, a deferral, or a bounce?
  3. Read the SMTP result. A 2xx response points toward recipient-side processing; 4xx and 5xx responses point toward transport or policy failure.
  4. Check all recipient folders and global search. Include Spam, Junk, Archive, category tabs, and shared mailboxes.
  5. Ask for full headers from any copy that is found. Inspect Received, Authentication-Results, return-path, and DKIM data.
  6. Verify SPF, DKIM, and DMARC. Confirm that the actual sending stream—not just your primary domain—passes and aligns.
  7. Test across controlled mailbox providers. Compare minimal and production-template messages.
  8. Escalate to the recipient administrator. Provide a precise timestamp, message ID, sender identities, and SMTP result.
  9. Fix the underlying pattern. Address authentication, reputation, content, list hygiene, or recipient-specific policy rather than endlessly resending.

This workflow applies whether you send through a REST email API, an SMTP relay, an in-house MTA, or a cloud email platform. The transport evidence changes in format, but the underlying question is always the same: where did the message stop becoming visible?

Conclusion

When an email says delivered but the recipient has not received it, the most likely explanation is not that the email vanished from the internet. More often, it was accepted by the recipient’s mail infrastructure and then filtered, quarantined, routed, archived, or hidden from the recipient’s normal view.

Treat “delivered” as a specific technical checkpoint: successful acceptance by a downstream system. Combine that checkpoint with SMTP codes, full headers, authentication results, controlled inbox tests, and recipient-side message tracing. That evidence-based approach turns a frustrating support report into a diagnosable mail-flow incident.

FAQ

Does delivered mean an email reached the inbox?

No. Delivered usually means a receiving mail server accepted the message. It may still go to Spam, Junk, quarantine, an archive, a category tab, a different folder, or another mailbox through forwarding or rules.

Can an email be delivered if SPF or DKIM fails?

Yes. Receiving systems can accept a message even when SPF or DKIM fails, then place it in Spam, quarantine it, or apply other policy actions. DMARC evaluates aligned SPF and DKIM results and can influence how the receiver handles failure.

Why is there no bounce if the recipient did not get the message?

A bounce is not guaranteed. The recipient system may have accepted the message and filtered it internally, or it may not generate a delivery status notification for a particular failure. No bounce is not proof of inbox placement.

What should I send to a recipient’s IT team?

Provide the sender address, envelope sender, recipient address, subject, UTC timestamp, message ID, final SMTP response, and authentication results. This lets the administrator search gateway, quarantine, and mail-flow logs accurately.

Should I resend the message right away?

Only if the SMTP result shows a temporary failure or you have a reason to believe the original did not reach the recipient infrastructure. If the message was accepted, first check spam placement, quarantine, recipient rules, and the recipient organization’s mail trace to avoid duplicates.