DEV Community

xusteve
xusteve

Posted on

How to Validate 10,000 Email Domains Without Sending a Single Email

Email list validation is usually done at the worst possible time: right before a campaign, when everyone is already nervous.

Sending test emails to 10,000 addresses is slow, damages sender reputation, and tells you very little about whether the domain itself can receive mail.

A better first pass is DNS-level validation. It will not prove that a mailbox exists, but it catches the expensive mistakes before you send anything.

What to check

For each domain, check:

  • syntax and IDN normalization
  • MX records
  • null MX
  • disposable or role-account domains
  • recently registered or parked domains
  • known blacklist status
  • SPF, DKIM and DMARC presence

These checks do not replace double opt-in. They stop you from sending to domains that clearly cannot or should not receive mail.

Normalize before checking

A file that looks clean often contains duplicates, trailing spaces, uppercase domains, and addresses pasted from spreadsheets.

const normalize = (value) =>
  value
    .trim()
    .toLowerCase()
    .replace(/^mailto:/, "")
    .replace(/[),.;]+$/, "");

const domainOf = (email) => email.split("@").pop();

const rows = rawInput
  .split(/\r?\n/)
  .map(normalize)
  .filter((email) => email.includes("@"));

const uniqueDomains = [...new Set(rows.map(domainOf))];
Enter fullscreen mode Exit fullscreen mode

Deduplicate by domain before doing DNS work. If 10,000 addresses belong to 700 domains, you have 700 checks, not 10,000.

Use the bulk tool first

For a one-off cleanup, the browser-based bulk checker is faster than writing a script:

https://mailers.email/tools/bulk-email-domain-check/

Paste the domains, review MX and authentication status, and export the result. The tool runs in the browser and does not require an account.

Use the API for spot checks

The public scan API is intentionally small:

curl -s https://api.mailers.email/v1/scan \
  -H 'content-type: application/json' \
  -d '{"domain":"example.com"}'
Enter fullscreen mode Exit fullscreen mode

Limits:

  • 60 requests per hour per IP
  • 24-hour cache per domain
  • no API key
  • one domain per request

Do not try to push 10,000 domains through a 60/hour endpoint. Use the bulk tool for the list, then use the API for a sample or for CI checks.

Classify the result

Do not reduce everything to “valid” and “invalid”. Use at least four buckets:

  1. Deliverable — MX exists and authentication looks sane.
  2. Risky — role account, disposable domain, new domain, or authentication missing.
  3. Undeliverable — no MX or null MX.
  4. Unknown — DNS timeout or ambiguous response.

Risky addresses are often the most valuable segment: they are the ones you should suppress or verify with double opt-in first.

What DNS validation cannot do

It cannot prove that person@example.com exists. Only the receiving server knows that, and probing it with SMTP can get your IP blocked.

Use DNS validation to protect your sender reputation, not to promise a perfect list.

Bulk checker: https://mailers.email/tools/bulk-email-domain-check/

Domain scanner: https://mailers.email/scan/

Top comments (0)