Bulk Email Validator for Syntax, Typos and Risky Addresses
This email validator checks up to 2,000 addresses at once and tells you more than just pass or fail. Besides strict syntax checking, it flags misspelled popular domains, known disposable inbox providers, role accounts such as support@ and repeated entries, which are the problems that actually hurt deliverability and sign-up quality.
What does the syntax check cover?
An email address has a local part, an @ and a domain. The validator applies the rules most mail systems enforce in practice:
- The local part is at most 64 characters, cannot start or end with a dot, and cannot contain two dots in a row unless it is quoted.
- The domain must end in a real-looking top-level domain, so
user@localhostanda@bfail. - Spaces are only allowed inside a quoted local part such as
"john doe"@example.com. - International addresses are accepted, both Unicode local parts (
josé@example.com) and internationalized domains (user@münchen.de). - Plus addressing like
first.last+news@gmail.comis valid and kept as is.
When an address fails, the tool names the reason, such as "missing @", "consecutive dots" or "domain has no valid TLD", so you know what to fix instead of guessing.
Example
Pasting this list:
ann.lee@example.com
bob@gmial.com
bad..dots@example.com
Jane Doe <jane@mailinator.com>
support@company.io
no-at-sign.example.com
ANN.LEE@example.com
returns:
✔ ann.lee@example.com
✔ bob@gmial.com — did you mean @gmail.com?
✘ bad..dots@example.com — consecutive dots
✔ jane@mailinator.com (display name: Jane Doe) — disposable email provider
✔ support@company.io — role address (not a person)
✘ no-at-sign.example.com — missing @
✔ ANN.LEE@example.com — duplicate
Note that bob@gmial.com is syntactically valid, which is exactly why typo detection matters: a syntax-only check would let it through and the welcome email would never arrive.
The extra checks explained
- Domain typos catch common slips in the big providers, such as
gmial.com,gmail.con,hotmial.comandoutlok.com, and suggest the intended domain. - Disposable providers such as Mailinator, YOPmail and 10 Minute Mail give out inboxes that expire. They are flagged, not rejected, because your policy decides what to do.
- Role addresses like
info@,admin@,sales@andnoreply@usually reach a shared inbox or nobody, and are poor targets for marketing mail. - Duplicates are detected case-insensitively, since mailbox names are treated that way in practice.
The Allow IP-address domains option accepts forms like user@[192.168.0.1]. They are technically legal but almost never used by real people, so they stay off by default.
Syntax check vs. verification
A valid result means the address is well-formed, not that the mailbox exists. Confirming that requires a DNS lookup for mail servers and, reliably, only a message the user clicks to confirm. That is why double opt-in remains the standard for sign-up forms. Use this tool to clean a list and catch errors at the form, then let a confirmation email do the rest.
For list cleanup, pair it with remove duplicate lines and the phone number validator. If you validate emails in your own code, test your pattern in the regex tester, but keep in mind a single regex rarely covers every rule above.
Privacy
All checks run locally in your browser, with no server requests and no mail sent to any address. Your list is never uploaded or stored, which matters when it contains customer data.
Email validator in Python
The standard library can split an address with email.utils.parseaddr() but does not validate it, and a single regular expression rarely covers rules such as consecutive dots or internationalized domains. The email-validator package checks the syntax and returns a normalized address. What people overlook is that validate_email() also looks up the domain in DNS by default; pass check_deliverability=False for a fast, offline syntax check.
# pip install email-validator
from email_validator import validate_email, EmailNotValidError
addresses = [
"ann.lee@example.com",
"bad..dots@example.com",
"no-at-sign.example.com",
"José@Example.COM",
]
for address in addresses:
try:
result = validate_email(address, check_deliverability=False)
print("valid ", result.normalized)
except EmailNotValidError as err:
print("invalid", address, "-", err)
Run the same list through the validator above to compare: it accepts and rejects the same four addresses, and adds warnings for domain typos, disposable providers and role accounts.