Skip to content

Email not received? A systematic debugging order

When a customer says your email never arrived, work the problem in order: your logs, the SMTP response, authentication, filtering, then the recipient.

Koltrix Team4 min read
A magnifying glass on a white table
Photo by Markus Winkler on Unsplash
On this page(11 sections)
  1. Step 0: get the specifics
  2. Step 1: did your application try to send?
  3. Step 2: did your provider accept it?
  4. Step 3: what happened at the receiving server?
  5. Step 4: delivered, but not seen
  6. Step 5: check your authentication
  7. Step 6: check reputation and patterns
  8. Step 7: work with the recipient's administrator
  9. Common resolutions
  10. Checklist
  11. Key takeaways

"I never got the email" is a symptom with at least a dozen causes, and the fastest way to find the right one is to check them in a fixed order. Start where you have the most information, which is your own system, and work outward toward the recipient, where you have the least.

Step 0: get the specifics

Before investigating, collect:

  • The exact recipient address, copied rather than retyped.
  • Which email it was: password reset, invoice, invitation.
  • Approximately when it should have been sent, and the recipient's time zone.
  • Whether other emails from you reach them, and whether colleagues at the same organization get yours.

A surprising number of cases end here: a typo in the address, an email sent to a work address when the user checked a personal one, or a message sent before the user expected it.

Step 1: did your application try to send?

Check your own records first. Was an email requested for this user and event?

  • If there is no record, the problem is in your product logic: a trigger did not fire, a feature flag was off, a job failed, or the user's preferences opted them out.
  • Check whether the address is on your suppression list because of a previous bounce or complaint. Suppressed addresses are skipped silently in many systems, which is correct behavior but confusing if nobody can see it.

Step 2: did your provider accept it?

If your system attempted the send, find the provider's response:

  • An API error (4xx or 5xx) or an SMTP rejection from your relay means the message never left. Common reasons: the From address is not verified, the API key lacks permission, a rate limit, or a validation error such as a malformed recipient.
  • A success response means the provider queued the message. Record the provider's message ID; you need it for the next steps.

Step 3: what happened at the receiving server?

Look up the message in your provider's logs or events using its ID. You are looking for one of these outcomes:

Outcome What it means Next step
Delivered / accepted (250) The recipient's server took responsibility for it Go to step 4
Deferred (4xx), still retrying The receiving server is delaying, perhaps greylisting or rate-limiting Wait; check if deferrals persist
Bounced, mailbox unknown (5.1.1) The address does not exist Ask the user to correct it
Bounced, policy or spam (often 5.7.x) The receiver refused based on reputation, authentication or content Investigate authentication and reputation
Bounced, mailbox full (often 4.2.2 or 5.2.2) Storage quota exceeded Ask the user to clear space
Dropped by provider Suppressed or blocked before sending Check suppression reason

Read the full SMTP response text in the bounce, not only the code. Receivers often say exactly why.

Step 4: delivered, but not seen

A 250 acceptance means the receiving server took the message, not that it reached the inbox. From here, the message may have been:

  • Filed as spam or junk. Ask the user to check spam, and any quarantine their organization uses.
  • Sorted into a tab or folder, such as Gmail's Promotions or Updates, or a rule-based folder.
  • Quarantined by a corporate gateway. Business recipients often have security appliances that hold messages for administrator review without notifying the user. Their IT team can search the quarantine.
  • Removed by a user rule or forwarded elsewhere.
  • Delayed internally by the recipient organization's own mail routing.

If it landed in spam, check the received headers on a copy, if the user can forward it as an attachment or share the original source, for authentication results.

Step 5: check your authentication

Whether the message bounced for policy reasons or landed in spam, confirm your authentication is healthy:

dig +short TXT example.com | grep -i spf1
dig +short TXT _dmarc.example.com
dig +short TXT k1._domainkey.example.com

Then send a test to a mailbox you control at the same provider as the recipient, and read the Authentication-Results header. You want SPF or DKIM to pass and align, and DMARC to pass. A recent DNS change or a new sending service is a common culprit.

Step 6: check reputation and patterns

If authentication is fine, widen the view:

  • Is it one recipient or many? Look at bounce and delivery rates for the same receiving domain over the past few days. A spike suggests a block or reputation issue at that provider.
  • Is it one template? A single template with poor delivery may have content or link problems, such as a link to a domain on a blocklist.
  • Are you listed on a blocklist? Check your sending IPs and domains against major blocklists if bounces mention them.
  • What do postmaster tools say? Google Postmaster Tools and Microsoft SNDS show reputation and complaint data for their users.

Step 7: work with the recipient's administrator

For business recipients, the most effective step is often to ask their IT team to search their mail logs for the message by time and sender. They can see whether their gateway accepted, quarantined or rejected it and why. Provide the date, time, From address, subject and the provider's message ID or the Message-ID header.

Common resolutions

  • Typo in the address: fix it and resend.
  • Suppressed after an old bounce: verify the address works, remove the suppression, resend.
  • Corporate quarantine: ask IT to release it and allowlist your sending domain.
  • Spam folder: confirm authentication, ask the user to mark it not spam, and review content.
  • Receiver block: investigate reputation, fix the cause, follow the receiver's mitigation process.

Checklist

  • Exact address, email type and time confirmed.
  • Application logs show the send was requested.
  • Address checked against the suppression list.
  • Provider response and message ID found.
  • Receiving server's response read in full.
  • Spam, tabs and quarantine checked for accepted messages.
  • Authentication verified with a test message.
  • Patterns checked across recipients, domains and templates.

Key takeaways

  • Debug in order: your app, your provider, the receiving server, then the recipient's mailbox.
  • Suppression lists and typos explain a large share of "never received" reports.
  • A 250 acceptance means the receiver has the message; it may still be filtered or quarantined.
  • Read full SMTP responses; they usually name the cause.
  • For business recipients, their administrator's logs are often the fastest answer.

Start with Koltrix

Your domain, one inbox, and an API that sends.

A team inbox where AI sorts and drafts (nothing is sent without your click), plus the transactional API and SMTP relay your product sends with. 7 days free, no card.

SharePost on XLinkedIn
More in Guides →