Engineering16 min read

SMTP Email Verification: How It Works and Limits

Understand SMTP email verification, including mailbox checks, catch-all results, privacy limits, and when to use an API for better accuracy.

B
The Bounceable Team
Envelope being checked at a mail server gate before delivery

SMTP email verification checks whether a receiving mail server appears willing to accept a specific address. You use it to verify email address without sending a message, usually before signup, list import, outreach, or another workflow that could create bounces.

What SMTP email verification means

SMTP email verification means checking whether the destination mail server appears willing to accept mail for an address.

It is sometimes called smtp mailbox verification, SMTP probing, or mailbox probing. The basic idea is simple. You open an SMTP connection to the recipient domain’s mail server and ask whether it would accept a message for a specific address. Then you stop before sending the message body.

A simplified check answers this question:

“If I tried to send to person@example.com, would the server accept the recipient during the SMTP conversation?”

That is different from syntax validation.

Syntax validation checks shape:

  • Does the address contain one @?
  • Is the local part valid enough?
  • Is the domain formatted correctly?
  • Are there invalid characters?
  • Is the address too long?

SMTP verification checks behavior:

  • Does the domain receive email?
  • Does it have MX records or fallback A/AAAA records?
  • Does the mail server accept the recipient?
  • Does it reject the mailbox?
  • Does it respond with a temporary failure?
  • Does it accept everything, which may indicate a catch-all domain?

You use SMTP checks to reduce bounces before they happen. Common places include:

  • Signup forms
  • Trial registrations
  • Lead capture forms
  • Sales prospect imports
  • CRM enrichment flows
  • Newsletter list imports
  • Cold outreach campaigns
  • Re-engagement sends to stale contacts

But SMTP verification has a hard limit. It does not prove the user owns the inbox. A mail server may accept alice@example.com, but that does not mean the person typing it controls that mailbox. For ownership, you still need a confirmation email, magic link, OTP, or similar flow.

Use SMTP verification to reduce bounce risk. Use email confirmation to prove account ownership. They solve different problems.

How SMTP verification works step by step

SMTP verification works by resolving the recipient domain, connecting to its mail server, and testing recipient acceptance without sending content.

A typical flow looks like this.

1. Parse and normalize the email address

Start before SMTP.

You should normalize and validate the address enough to avoid pointless network calls. This usually includes:

  • Trimming whitespace
  • Lowercasing the domain
  • Preserving the local part unless you have provider-specific rules
  • Converting internationalized domains to Punycode where needed
  • Rejecting clearly invalid syntax
  • Checking length limits
  • Detecting obvious typos such as gmial.com

Do not over-normalize local parts. Gmail-style dot removal and plus-address handling do not apply to every provider. Treat those as provider-specific heuristics, not global email rules.

2. Check domain DNS and MX records

Next, resolve the domain.

For user@example.com, you check whether example.com can receive mail. The usual path is:

  1. Query MX records.
  2. Sort MX hosts by priority.
  3. Try the preferred MX first.
  4. Fall back to other MX hosts if needed.

If a domain has no MX records, SMTP technically allows delivery to its A or AAAA record in some cases. In practice, many verification systems treat no MX as high risk or undeliverable unless fallback behavior is explicitly supported.

DNS can fail temporarily. Timeouts, SERVFAIL, and resolver issues should not always become hard rejects. Classify them carefully.

3. Connect to the receiving mail server

Then you open a TCP connection to port 25 on the selected MX host.

You should use:

  • Short but reasonable connection timeouts
  • TLS when offered via STARTTLS, where practical
  • A stable outbound IP reputation
  • A valid HELO/EHLO hostname
  • Conservative concurrency by recipient domain

This is where many homegrown implementations fail. Large mailbox providers do not treat all probing traffic equally. A poorly configured verifier can look like a spam tool.

4. Use SMTP conversation steps

A minimal SMTP conversation usually follows this pattern:

S: 220 mx.example.com ESMTP
C: EHLO verifier.yourdomain.com
S: 250-mx.example.com
S: 250 STARTTLS
C: MAIL FROM:<verify@yourdomain.com>
S: 250 2.1.0 OK
C: RCPT TO:<person@example.com>
S: 250 2.1.5 OK
C: QUIT
S: 221 Bye

The important command is RCPT TO.

If the server returns a 2xx code for the recipient, it appears willing to accept the address. If it returns a 5xx code, it may be rejecting the mailbox. If it returns a 4xx code, the result is temporary or inconclusive.

You stop before the DATA command. You do not send a subject, body, or message content.

5. Interpret responses

SMTP response codes matter, but they are not always clean.

Common categories:

SMTP responseMeaningTypical verdict
250 at RCPT TOServer accepted the recipientDeliverable or risky
550 mailbox unavailableServer rejected the recipientUndeliverable
551 / 553 recipient invalid or not allowedAddress likely invalidUndeliverable
421 service unavailableServer temporarily unavailableUnknown or retry
450 / 451 / 452 temporary failureGreylisting, throttling, or capacity issueUnknown or retry
TimeoutNo usable responseUnknown
Accepts random addresses tooCatch-all behaviorRisky

You need more than one probe in some cases. For catch-all email detection, you may test the target address and one or more random, likely nonexistent addresses at the same domain. If both are accepted, the domain may be accept-all.

6. Close the connection without sending a message

Responsible mailbox probing ends the session cleanly.

You issue QUIT and close the connection. You do not proceed to DATA. You do not send a blank message. You do not create a real email event at the recipient mailbox.

That is the core appeal of SMTP verification: you can estimate deliverability without sending.

What SMTP verification can detect

SMTP verification can detect several common causes of bounces before you send.

It works best when the receiving server gives direct answers.

Invalid mailboxes rejected by the server

Some servers reject nonexistent recipients during RCPT TO.

For example:

C: RCPT TO:<not-a-user@example.com>
S: 550 5.1.1 User unknown

That is a strong signal. You should not send to that address.

This is the cleanest win for smtp email verification. You remove addresses that would otherwise hard bounce.

Domains without valid MX records

DNS checks catch domains that cannot receive mail.

Examples include:

  • Mistyped domains
  • Parked domains
  • Domains with broken DNS
  • Domains that do not publish MX records
  • Domains with MX records pointing to invalid hosts

These checks happen before SMTP, but they are part of practical email deliverability validation.

Temporary SMTP failures

SMTP can surface temporary issues.

A server may return:

  • 421 when it is unavailable
  • 450 for a temporary mailbox condition
  • 451 for a local processing error
  • 452 when storage or capacity is constrained

You should not treat every 4xx as invalid. Retry later. If the same temporary failure repeats across attempts, classify it as unknown or risky rather than deliverable.

Some role accounts and risky patterns

SMTP alone does not reliably identify role accounts like info@, support@, or admin@. But your verification pipeline can flag them with pattern rules.

Role accounts are not always bad. They can be valid for B2B communication. But they may perform worse for product signups, personal account creation, and lifecycle messaging.

Other useful pattern checks include:

  • noreply@ addresses
  • Very long local parts
  • Random-looking strings
  • Known abuse patterns
  • Free provider domains
  • Disposable or burner domains

Catch-all or accept-all behavior

Some domains accept every recipient during SMTP.

For example:

RCPT TO:<real.person@example.com>      -> 250 OK
RCPT TO:<random-9f8d7a@example.com>   -> 250 OK

That does not prove both mailboxes exist. It means the server accepts mail broadly and decides later what to do.

Catch-all domains are common enough that you need a specific verdict. Do not mark them the same as confirmed mailboxes.

Why SMTP verification is not always conclusive

SMTP verification is useful, but it cannot force a mail server to reveal the truth.

Modern mail systems optimize for abuse prevention, privacy, and operational safety. That makes some results ambiguous.

Catch-all domains may accept every address

A catch-all server accepts mail for any local part at a domain.

That means these addresses may all pass the SMTP recipient check:

  • jane@example.com
  • sales@example.com
  • made-up-address-123@example.com

The target address could be real. It could also be fake. SMTP cannot tell you which if the server accepts everything.

A good verifier returns risky or a catch-all reason, not a confident deliverable.

Some providers block or throttle probes

Mailbox providers see verification traffic. Some allow it. Some tolerate it. Some rate limit it. Some intentionally return vague answers.

They may respond differently based on:

  • Your IP reputation
  • Your HELO hostname
  • Connection rate
  • Recipient domain
  • Sender address used in MAIL FROM
  • Whether you use TLS
  • Historical abuse patterns
  • Geographic network location

If you probe too aggressively, your results get worse. You may see more timeouts, 4xx responses, or generic rejections.

Greylisting can create temporary failures

Greylisting is an anti-spam technique. The server temporarily rejects a sender it has not seen before. Legitimate mail servers retry later. Many spam tools do not.

For verification, greylisting creates ambiguity. A 451 or 450 response may not mean the mailbox is bad. It may only mean, “try again later.”

You need retry logic. You also need a maximum retry window so verification does not hang your user flow.

Servers may hide mailbox existence

Some systems avoid confirming whether an address exists.

They do this to prevent:

  • Directory harvest attacks
  • User enumeration
  • Targeted phishing
  • Abuse of password reset flows
  • Competitive list scraping

A server may accept every recipient and silently drop invalid ones later. Or it may reject probes but accept real mail under different conditions.

This is why “verify email address without sending” should mean “estimate deliverability,” not “prove truth.”

Free providers and enterprise domains behave differently

Large free providers and enterprise domains often have more complex behavior than small business mail servers.

Free providers may be more consistent at scale, but they also watch abuse closely. Enterprise domains may sit behind gateways, filtering appliances, or hosted security layers. Those systems may accept mail first and decide later.

So your logic should not assume one universal SMTP behavior.

How to interpret SMTP verification results

You should interpret SMTP verification as a risk signal, not a courtroom verdict.

A production verifier should return a clear verdict plus reasons.

Deliverable versus undeliverable

Use deliverable when the address passes syntax, DNS, and mailbox checks with no major risk flags.

Use undeliverable when you have a strong negative signal, such as:

  • Invalid syntax
  • Domain does not exist
  • No usable mail server
  • Mailbox rejected with a hard 5xx response
  • Known invalid or dead domain
  • Disposable domain blocked by policy

A clean hard reject should be actionable. Suppress the address or ask the user to correct it.

Risky catch-all or accept-all addresses

Use risky when the address may work but you cannot confirm the mailbox.

Common risky reasons:

  • Catch-all domain
  • Role account
  • Disposable domain
  • Temporary SMTP uncertainty
  • Free provider plus suspicious pattern
  • Recent domain
  • Known high-bounce domain pattern

Risky does not always mean block. For a newsletter signup, you might allow it. For cold outreach, you might exclude it. For fraud-prone signup, you might require confirmation before account access.

Unknown or timeout results

Use unknown when the verifier cannot reach a confident result.

Examples:

  • DNS timeout
  • SMTP timeout
  • Connection refused by all MX hosts
  • Provider throttling
  • Ambiguous SMTP banner
  • TLS or network failure
  • Repeated temporary failures

Unknown should not equal valid. It should also not always equal invalid. Treat it based on the workflow.

Temporary failures that should be retried

Retry 4xx responses with care.

A reasonable approach:

  1. Retry once after a short delay for interactive flows only if latency allows.
  2. Queue a background retry for imports and batch jobs.
  3. Use exponential backoff for repeated temporary failures.
  4. Stop after a small number of attempts.
  5. Store the final verdict with the reason.

Do not hammer the same MX. You will degrade your own accuracy.

Why a risk score beats true/false

A boolean hides too much.

Compare these two results:

{
  "email": "person@example.com",
  "verdict": "risky",
  "score": 72,
  "reasons": ["catch_all_domain", "smtp_accepts_recipient"],
  "checks": {
    "syntax": "pass",
    "dns": "pass",
    "smtp": "accepted"
  }
}
{
  "email": "person@example.com",
  "verdict": "undeliverable",
  "score": 8,
  "reasons": ["mailbox_rejected"],
  "checks": {
    "syntax": "pass",
    "dns": "pass",
    "smtp": "rejected"
  }
}

Both need different handling. A risk score lets you tune policy by context instead of forcing every workflow into the same decision.

Implementation risks and best practices

Build SMTP verification as a polite, rate-limited network service, not as a tight loop over port 25.

Poor probing can hurt accuracy and reputation.

Avoid aggressive probing

Mailbox providers can identify abusive patterns.

Avoid:

  • High concurrency to the same domain
  • Repeated probes for random addresses
  • Missing or fake HELO hostnames
  • Disposable sender domains in MAIL FROM
  • No reverse DNS on outbound IPs
  • Long SMTP sessions that do not close cleanly
  • Rechecking the same address many times in a short window

You want to look like a well-behaved mail system.

Use timeouts and retries carefully

Set explicit timeouts for:

  • DNS lookup
  • TCP connect
  • SMTP banner
  • SMTP command response
  • Whole verification attempt

Keep interactive form checks fast. If SMTP takes too long, return unknown or continue in the background. Do not make a user wait ten seconds because one MX is slow.

For batch jobs, you can afford more retries and better backoff.

Respect rate limits by domain

Throttle by recipient domain and MX host.

This matters more than global concurrency. Probing 10,000 different domains once is not the same as probing one enterprise domain 10,000 times.

Keep per-domain budgets. Cache recent domain-level findings, especially:

  • MX lookup results
  • Catch-all behavior
  • Temporary provider throttling
  • Known blocked probing behavior
  • Disposable-domain status

Do not expose raw SMTP details to end users

Raw SMTP messages can confuse users and leak implementation detail.

Instead of showing:

550 5.1.1 Recipient address rejected: User unknown

Show:

“This email address does not appear to exist. Check for typos.”

For internal logs, keep the raw response. For user-facing UI, show plain guidance.

Log verdicts and reasons

You need enough data to debug false positives and false negatives.

Log:

  • Normalized email hash or safe identifier
  • Domain
  • MX host used
  • Final verdict
  • Reason codes
  • Timing
  • Retry count
  • SMTP category, not necessarily full raw transcript
  • Provider or domain-level throttling flags

Be careful with privacy. Do not store more personal data than you need.

Combine SMTP with other checks

SMTP is one layer.

A stronger pipeline also includes:

  • Syntax validation
  • DNS and MX validation
  • Disposable domain detection
  • Typo suggestions
  • Role account detection
  • Free provider detection
  • Catch-all email detection
  • Historical bounce data
  • Risk scoring

This is where a real-time email verification API can help. Bounceable, for example, combines SMTP checks with disposable-domain detection, catch-all handling, typo suggestions, role account flags, and a deliverability verdict.

SMTP verification versus an email verification API

An email verification API gives you SMTP verification plus the surrounding heuristics and maintenance you need for production.

You can build your own. Sometimes that makes sense. But understand the scope first.

ApproachProsConsBest fit
Build SMTP verification in-houseFull control, custom policy, internal data stays inside your systemRequires SMTP infrastructure, IP reputation management, provider heuristics, retry logic, catch-all detection, ongoing maintenanceLarge teams with deliverability expertise and special requirements
Use an email validation APIFaster integration, maintained domain intelligence, risk scoring, disposable detection, cleaner verdictsLess low-level control, vendor dependencySignup forms, CRM imports, outreach workflows, lifecycle marketing, most product teams
Hybrid modelCustom business rules plus API verdictsMore integration workTeams with unique risk policies but no desire to maintain SMTP probing

What you maintain when you build

A serious in-house verifier needs more than SMTP commands.

You need to maintain:

  • DNS resolver behavior
  • Outbound IP reputation
  • HELO and reverse DNS configuration
  • Per-domain throttling
  • Retry queues
  • Catch-all test logic
  • Disposable-domain lists
  • Typo dictionaries
  • Provider-specific behavior
  • Logging and observability
  • Abuse controls
  • Data retention policy
  • Result caching
  • Scoring and verdict rules

That is engineering work. It does not end after the first successful RCPT TO.

Why APIs are easier for real-time workflows

A real-time email verification API is usually easier to add to signup forms and operational workflows.

The application code stays simple:

curl -X POST "https://api.example.com/verify" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"person@example.com"}'

A useful response should give you more than pass or fail:

{
  "email": "person@example.com",
  "verdict": "risky",
  "score": 74,
  "reasons": ["catch_all_domain"],
  "suggestion": null,
  "flags": {
    "disposable": false,
    "role": false,
    "free_provider": false,
    "catch_all": true
  }
}

Your app can then apply policy:

  • Block undeliverable
  • Suggest typo fixes
  • Allow deliverable
  • Allow or challenge risky
  • Queue unknown for recheck
  • Require confirmation for higher-risk signups

When in-house verification may still make sense

In-house verification can make sense when:

  • You already operate mail infrastructure at scale
  • You have deliverability engineers on staff
  • You need strict data residency controls
  • You have proprietary bounce history
  • You need custom scoring tied to internal abuse systems
  • You can tolerate ongoing maintenance

For most teams, the API path is cheaper and safer.

Production apps should layer checks from cheap and certain to expensive and ambiguous.

Do not start with SMTP. Start with deterministic checks, then move toward network probing.

A practical decision flow

Use this order:

  1. Validate syntax. Reject addresses that cannot be valid email.
  2. Normalize safely. Lowercase the domain and handle internationalized domains.
  3. Suggest typo fixes. Catch common mistakes like gmial.com.
  4. Check disposable domains. Block or challenge burner addresses based on policy.
  5. Check DNS and MX. Reject domains that cannot receive mail.
  6. Detect role accounts. Flag info@, support@, admin@, and similar addresses.
  7. Probe SMTP where appropriate. Use conservative timeouts and domain-level rate limits.
  8. Run catch-all checks. Classify accept-all domains as risky.
  9. Return a verdict and reasons. Use deliverable, risky, undeliverable, or unknown.
  10. Store the result. Cache it with a timestamp and reason codes.
  11. Recheck stale addresses. Verify again before large sends.

Tune policy by workflow

Different workflows need different strictness.

For a low-risk newsletter signup:

  • Block invalid syntax.
  • Block known disposable domains if list quality matters.
  • Allow deliverable.
  • Allow risky but require engagement before heavy sending.
  • Recheck unknown later.

For product account creation:

  • Block undeliverable.
  • Suggest corrections for typos.
  • Challenge disposable domains.
  • Allow catch-all only with email confirmation.
  • Do not grant sensitive access until ownership is confirmed.

For cold outreach:

  • Exclude undeliverable.
  • Exclude unknown unless you can tolerate bounce risk.
  • Treat catch-all as risky.
  • Use stricter thresholds for new sending domains.
  • Recheck before campaign launch.

For fraud-prone signups:

  • Block disposable domains.
  • Require confirmation for free providers with suspicious patterns.
  • Treat role accounts carefully.
  • Combine email risk with IP, device, and behavior signals.

Do not use SMTP verification as permission to send. It reduces bounce risk. It does not replace consent, compliance, or user confirmation.

Recheck stale emails before large sends

Email data decays.

People leave companies. Domains change providers. Mailboxes get disabled. Catch-all rules change. A list that looked clean six months ago can bounce today.

Before a large campaign or CRM reactivation, recheck stale addresses. This protects sender reputation and gives you cleaner segmentation.

2%common bounce-rate ceiling many senders try to stay below

Keep your rules simple enough to explain:

  • If undeliverable, do not send.
  • If deliverable, send normally.
  • If risky, send only when the business case justifies the risk.
  • If unknown, retry or confirm before sending at scale.

SMTP mailbox verification works best when you treat it as one signal in a larger deliverability system. Combine it with DNS checks, disposable detection, catch-all handling, typo correction, and scoring. Then apply different policies for signups, imports, outreach, and high-risk flows.

Catch bad addresses before they bounce.
Verify your list free

Frequently asked questions

Keep reading