DEV Community

Axel Freeman
Axel Freeman

Posted on Originally published at tapacapi.com

An SMTP timeout is not a no

Most lead lists have two values for a checked address: good and bad. Verification tools that only speak those two words are throwing away the third answer, and it is the one that costs you contacts.

Three ways a probe ends

An SMTP probe is a conversation, and it can end in three ways:

Outcome Who produced it What it means
Refusal (5xx) The receiving mail server A statement about the mailbox, right now
Acceptance (2xx) The receiving mail server The server will take mail for this address - not proof the mailbox exists on a catch-all
Timeout / hold / connection reset Anything on the path Nothing about the mailbox at all

The third row is the one pipelines mishandle. It has no code that looks like a verdict and nobody to quote, so a two-state pipeline writes it as bad.

Why silence is normal

  • Greylisting. A server that has not seen your host before may hold the first attempt and invite you to try again. The answer is a delay, not a verdict.
  • Rate limits. Probes are connections. Send enough of them from one host and you get throttled or dropped long before anyone refuses you.
  • Routing. The receiving server never saw the question. The address had nothing to do with it.
  • Slow catch-alls. Domains that accept everything are the ones with least reason to make checks cheap.

The two mistakes are not symmetric

Marking a dead address as live costs a bounce: small, visible, self-correcting. Marking a live address as dead costs the contact in every campaign that uses that file afterwards, and no bounce ever reports it. That is how a list shrinks for reasons nobody wrote down - and why a bounce rate can improve while a list gets worse.

It also corrupts the number you quote. Checked contacts carry a published 2-5% bounce rate against 10-35% for static, resold databases, and part of the second number is addresses that were never actually tested.

How to keep the third state

  1. Record unknown as its own value. Not undeliverable, not deliverable - "the question was not answered".
  2. Retry silence on a schedule, not in a tight loop. Holds and greylists clear in minutes to hours; re-probing within the same second reproduces the same silence.
  3. Cap your probe rate per host. Throttling yourself below the point where the other side stops answering is cheaper than re-running a list you never measured.
  4. Treat unknown as a decision at send time - lower priority, different template, or a check taken at the moment of use - never a deletion.
  5. Store the reason, not just the state. "Timeout" and "refused" lead to opposite actions a week later even though both look like a non-delivery today.

TAPAC probes the mailbox during the search that found the contact and keeps the three outcomes apart: deliverable, undeliverable, or unknown for catch-all domains and unanswered probes, with the probe time and the source page on every row. A silent server produces an unknown row, not a deleted contact. Pay-per-use at $0.10-0.50 per contact from 100 free searches.

npx -y @tapacapi/mcp        # tools: tapac_find_contacts, tapac_status
# hosted: https://tapacapi.com/mcp
# REST:   POST https://tapacapi.com/v1/contacts/search
Enter fullscreen mode Exit fullscreen mode

Top comments (0)