← All resources
July 24, 20269 min

How to Verify Email Addresses: A Practical Guide

How email verification works — syntax, MX records, SMTP checks, and catch-all detection — why it matters for deliverability, and the tools that do it.

CG
Costin Gheorghe
Founder, Outsoci

An email address that looks correct and an email address that actually works are two different things, and the gap between them is exactly what email verification exists to close. Whether you're checking one address you found manually or cleaning an entire list before a campaign, verification runs through the same layered checks — and understanding what each layer actually confirms (and where it can't confirm anything conclusively) is the difference between a clean send and a bounce rate that tanks your sender reputation.

Why verification matters more than most people assume

Mailbox providers track how often mail sent from your domain bounces, gets marked as spam, or goes unopened, and they use that signal to decide whether your next email lands in the inbox or the spam folder — for every recipient, not just the bad addresses. A bounce rate above roughly 3-5% is enough to start damaging your sender reputation, and once that happens, even your genuinely good, engaged recipients start seeing your mail routed to spam. Verification isn't a nice-to-have quality check; it's what protects your ability to reach anyone at all — it's why validation shows up as a required step in workflows like our Google Maps lead scraping guide, not an optional add-on at the end.

There's also a subtler cost: sending to invalid addresses at any real volume is one of the fastest ways to get flagged as a spam trap hit, since abandoned or fake addresses are exactly what deliverability watchdogs use to catch bulk senders behaving carelessly.

Layer 1: Syntax validation

The first and simplest check: is the address even formatted correctly? A valid email needs a local part, an @, and a domain with a valid top-level domain — jane@acme.com passes, jane@acme or jane.acme.com fails.

This catches typos and obviously malformed entries — someone fat-fingering a domain, a scraped page mangling an address across a line break, a form submission with a stray character. It's the cheapest check to run and the one that filters out the most obviously unusable data before you spend any more effort on an address. It confirms nothing about whether the address actually exists, though — plenty of syntactically perfect addresses point at inboxes that were deleted years ago.

Layer 2: Domain and MX record check

Next, confirm the domain itself can receive mail at all. This means querying the domain's MX (Mail Exchange) records — the DNS entries that tell the internet which mail servers handle email for that domain.

This layer is cheap and fast to run, and it catches a real category of bad addresses: domains that have expired, been let go, or never set up mail service in the first place — surprisingly common on scraped data pulled from outdated pages.

Layer 3: SMTP mailbox check

This is where verification gets genuinely useful, and also genuinely limited. An SMTP check connects to the domain's mail server and simulates the first steps of actually sending an email — without sending it — to see whether the server confirms or rejects that specific mailbox exists.

Mechanically, this involves opening a connection to the mail server, issuing a RCPT TO:<address> command, and reading the server's response code: a 250 OK generally means the server is confirming the mailbox exists, while a 550 or similar rejection means it doesn't. This is the layer that actually answers "does this specific inbox exist," rather than just "is the domain capable of receiving mail in general."

It has real limits, though, and being upfront about them matters:

Layer 4: Catch-all detection and risk flags

A catch-all (or accept-all) domain is configured to accept mail sent to any address at that domain, valid or not, typically routing anything unmatched to a general inbox rather than bouncing it. For verification purposes, this is the single biggest source of false confidence: an SMTP check against a catch-all domain returns "accepted" for literally-anything@thatdomain.com, which means a "valid" result tells you nothing about whether the specific mailbox you're checking actually exists.

A thorough verification pass detects catch-all behavior directly — typically by testing a deliberately made-up, near-certainly-nonexistent address at the same domain and seeing if the server accepts that too. If it does, the domain is catch-all, and any "valid" result for your real target address should be treated as unconfirmed, not verified — a real bounce risk even though the SMTP check technically "passed."

Beyond catch-all status, a complete verification pass also flags:

Check syntaxQuery MX recordsRun SMTP checkDetect catch-allstatusBucket by risk
The four-layer email verification pipeline

Results table: how to bucket what you find

ResultWhat it meansRecommended action
ValidPassed syntax, MX, and a confirmed SMTP mailbox checkSend with confidence
Catch-all / accept-allDomain accepts any address; specific mailbox unconfirmedSend cautiously, lower priority, monitor closely
Risky / role-basedDeliverable but shared, generic, or otherwise lower-confidenceSegment separately, don't lead with these
DisposableTemporary inbox, functionally unreachable long-termRemove entirely
InvalidFailed syntax, no MX, or explicit SMTP rejectionRemove entirely

A healthy list, after verification, should have the valid bucket dominate, with projected bounce rate under 3%. If catch-all or risky results make up a large share of your list, that's usually a signal about where the contacts were sourced from — some data sources correlate more heavily with catch-all-configured domains — rather than something verification itself can fix.

Doing an SMTP check manually (and why you probably shouldn't at scale)

It's possible to run a rudimentary SMTP check by hand using a command-line tool like telnet or openssl s_client to connect to a domain's mail server on port 25, issue HELO, MAIL FROM, and RCPT TO commands, and read the response code directly. This is worth knowing conceptually — it demystifies what a "verification tool" is actually doing under the hood, and it's a reasonable way to sanity-check a single address if you're comfortable in a terminal.

It's a poor approach at any real volume, for a few concrete reasons:

For one address, a dedicated checker tool does the same thing with the ambiguity already handled. For a list, this manual approach simply doesn't scale — which is exactly why bulk verification services and built-in pipeline verification exist.

Tools for checking a single address

If you just need to confirm one address before sending — you found a candidate email manually and want to check it's real before you use it — a single-address checker is the right scale of tool. Outsoci's free email checker runs the syntax, MX, and SMTP layers in seconds and flags catch-all status, which covers the common "I have one email, is it good?" case without needing to set up anything for a whole list.

Verifying at list scale

Checking one address by hand (or with a free single checker) doesn't scale to a list of hundreds or thousands — running each one through a manual SMTP check individually is impractical, and most mail servers will start rate-limiting or blocking rapid sequential checks from the same source regardless. At that scale, you need either a dedicated bulk-verification service, or a list-building tool with verification built into the collection pipeline itself, so every contact is checked as part of being found rather than as a separate pass afterward.

This is the approach Outsoci takes across its ten scraping sources — Google Maps, LinkedIn, Instagram, Facebook, X, YouTube, TikTok, Reddit, Threads, and ProductHunt — running the full four-layer check on every extracted email before it lands in your export, rather than handing back raw, unverified candidates and leaving validation as a step you have to remember to run separately. The $1 trial includes 100 credits if you want to see the verification pass in action against a real list. For the fuller picture of building a list this way from scratch, see our guide on building a verified cold email list.

Comparing verification approaches

ApproachEffortHandles catch-all detectionScales to a full listBest for
Manual SMTP (telnet)High, technicalNo, requires manual judgmentNoUnderstanding the mechanics, one-off checks
Free single checkerLowYesNo, one address at a timeConfirming one found or guessed address
Bulk verification API/serviceModerate setupYesYesCleaning an existing list before a send
Built into a list-building pipelineNone, automaticYesYesLists sourced and verified in one pass

The right choice depends on where you are in the process. If you've already got a list from any source — purchased, scraped elsewhere, exported from a CRM — a bulk verification pass before sending is the non-negotiable step regardless of how you obtained the contacts. If you're building the list from scratch, verification built into the sourcing pipeline itself avoids a separate cleanup step entirely, since every contact is checked the moment it's found rather than in a second pass you have to remember to run. And if you're still at the earlier step of actually locating an address before you can verify it, our guide on how to find someone's email address covers the discovery methods this one assumes you've already run.

Common mistakes when verifying emails

Key takeaways

FAQ

What is email verification and why does it matter? Email verification checks whether an address is real and deliverable before you send to it, using syntax validation, domain/MX record checks, an SMTP mailbox check, and catch-all/risk detection. It matters because a high bounce rate damages your sender reputation with mailbox providers, which can push even your good, engaged recipients' mail into spam.

Can email verification guarantee an address will never bounce? No — verification confirms an address's state at the moment you check it, but mailboxes can be deleted, domains can lose mail service, and catch-all domains produce genuinely inconclusive results even when the check technically "passes." Treat verification as significantly risk-reducing, not a hard guarantee, and re-verify lists you're reusing after any real time gap.

What does it mean when an email domain is "catch-all"? A catch-all domain accepts mail sent to any address, valid or not, rather than rejecting unknown ones. This means an SMTP check can't confirm whether your specific target mailbox actually exists — treat catch-all results as unconfirmed and send to them more cautiously than a fully verified address.

How do I verify a single email address for free? A free single-address checker — like Outsoci's email checker — runs the syntax, MX, and SMTP layers and flags catch-all status in seconds, which covers the common case of confirming one candidate address before you send to it.

How often should I re-verify an email list? Re-verify before any new campaign if meaningful time has passed since the list was last checked — contact data decays continuously as people change roles and companies restructure, so a list that was clean months ago isn't guaranteed to be clean now.

Is SMTP verification the same as actually sending an email? No — an SMTP check opens a connection and asks the receiving mail server to confirm a mailbox exists (via a RCPT TO command) without completing an actual message delivery. It's a lightweight probe, not a real send, though some servers respond to it less reliably than others, which is part of why results aren't always perfectly conclusive.

Stop buying stale lead lists

Pull fresh, verified contacts from Google Maps and social media — export in one click.

Try Outsoci today →