VerifyMail by Madhumitha Challa

Bulk email verifier for HR and anyone who sends to lists. Rules decide first; people decide only the exceptions. Every decision is logged.

1. Import

Address list Excel (.xlsx), CSV, or TXT (one address per line). The first sheet is read, and the column named Email is used if present. Replaces the current queue.
DNS results (optional, recommended) CSV from check_emails.py --csv. Without it, every address stays PENDING and nothing can be approved.

Team mode (optional)

Connect your own Supabase project to share one queue with your team in real time. Each person signs in with an email link. Reload the page after signing in to switch to team mode.

3. Export and audit

Each button saves a file. Downloads are blocked inside the Claude viewer, so open this page as a file in your browser to save them. Text also goes into the box below to copy. Use the state JSON to move work between browsers.

Restore state from a JSON backup
Status guide: what each status means and what to do

Every address has one status. Work through them in this order: fix or remove REJECT, check PENDING, decide REVIEW, then send to APPROVE.

StatusWhat it meansWhat to do
APPROVE The address passed every rule, and DNS shows the domain accepts mail. Nothing in the list blocks it. Safe to send. APPROVE does not guarantee the message reaches the inbox. After you send, record what happened in Accuracy check.
REJECT The address failed a hard rule. It is malformed, uses a placeholder domain, its domain cannot receive mail, or the mail server refused it. It will bounce or was never valid. Do not send. If you typed it wrong, open it, use Correct the address, and the address goes back to PENDING for a DNS re-check. Otherwise remove it from the list.
REVIEW No hard failure, but a flag needs a person to decide. The reason is in the Rules column (see the review reasons below). Read the reason. Fix or confirm the address, then decide with Accept as exception (code EX1 to EX4) or Reject (code REJ1 to REJ3). Your note must say what you checked. Open REVIEW rows block the send until decided.
PENDING The tool has no DNS result for this address, so it cannot be verified yet. Nothing with this status can be approved. Click Copy pending addresses, run check_emails.py on them, then upload the results under DNS results. The status changes on its own.

Result labels: what each label means

LabelOur statusWhat it meansWhat to do
DeliverableAPPROVEPassed every check. The domain accepts mail.Safe to send. Record the real result afterwards in Accuracy check.
RiskyREVIEW (R04, R05, R06)Might work, but the address has a known risk: a typo domain, a throwaway address, or a shared inbox.Decide first. Accept with the right exception code, or reject with a reason.
UnknownREVIEW (R11, R12)The check could not finish. The mail server did not answer, or the domain setup is unusual.Retry the DNS check later. Only decide now if you have checked it yourself.
UndeliverableREJECT (R01, R02, R03, R09, R10)The address is invalid, the domain cannot receive mail, or the server refused the person.Do not send. Correct a typo, or remove the address.
DuplicateRemoved on importThe same address appeared more than once in your list.Nothing to do. Only one copy is kept, so it is never sent twice.
Not checked yetPENDING (R08)No DNS result has been imported for this address.Run the DNS checker, then import the results.

Review reasons (REVIEW rows)

CodeWhat it meansWhat to do
R04The domain looks like a typo of a common provider, such as gmai.com for gmail.com.Open the row. If the person meant the common provider, use Correct the address with the fixed address (it re-checks DNS), or accept with EX1 if the owner confirmed it is correct.
R05A disposable (throwaway) mail domain, such as mailinator.com. These are often fake sign-ups and rarely reach a real person.Reject with REJ3 unless someone at the business approved this address for a test. Then accept with EX2 and name that approver in the note.
R06A role address, such as info@, sales@, support@ or noreply@. It reaches a shared inbox, not one person, and may be a spam trap.Accept with EX2 only if the business approved sending to that shared inbox. Otherwise reject with REJ3 and say why in the note.
R11The DNS check could not finish: a temporary failure, port 25 blocked, or a DNS error. The result is unknown, not bad.Run the DNS check again later for these addresses. When the retry succeeds, the status updates. If you must decide now, accept with EX3 and say how you verified.
R12The domain has no MX record, so mail falls back to its web address. That is unusual and may be misconfigured.Check the domain yourself (for example, the company's website). If it clearly receives mail, accept with EX3 and say how you checked. Otherwise reject with REJ3.

Hard rejects (REJECT rows)

CodeWhat it meansWhat to do
R01Syntax invalid: missing @, extra characters, or no valid domain.Correct the typo with Correct the address, or remove the row.
R02Too long: over 254 characters, or the part before @ is over 64.Check the source. Such addresses are almost always errors. Remove them.
R03Placeholder domain, such as example.com, test.com or localhost. These are never real.Remove. If it is a real address on a test domain, use a real one.
R09The domain does not exist, has a null MX record, or has no mail server.Remove. If the domain was typed wrong, correct it and re-check.
R10The receiving server refused this recipient (a 5xx answer). The mailbox probably does not exist.Remove. Only re-check if you have reason to believe the mailbox now exists.

Exception codes (what to choose)

CodeUse it when
EX1The list owner or a trusted person confirmed the address is correct.
EX2The business approved a role or disposable address for this purpose. Name the approver in the note.
EX3A DNS retry succeeded, or you checked the domain yourself. Say how in the note.
EX4None of the above. Explain fully in the note.
REJ1The address bounced before (for example, in an earlier send).
REJ2The owner confirmed the address is wrong or no longer used.
REJ3Something else. Explain in the note.

Notes must be at least 10 characters and say what you checked. Your name is required to decide. Every decision is written to the audit log. REJECT rows cannot be accepted, only corrected.

Rulebook (summary)

Full rulebook is in RULEBOOK.md. Hard rules reject. Review rules need an exception decision. Pending rows need DNS results.

CodeRuleResult

Exception codes (accept): EX1 owner confirmed, EX2 business-approved role or disposable, EX3 DNS verified or retry succeeded, EX4 other. Reject codes: REJ1 previously bounced, REJ2 owner confirmed invalid, REJ3 other. Notes must be at least 10 characters.

Glossary: words explained simply

Each word has a short, everyday meaning. Use your browser's search (Ctrl+F) to find one.

Address
Where an email goes, such as name@company.com.
Domain
The part after the @, such as company.com. It names the organisation.
DNS
A public directory on the internet. It tells the world where a domain's mail should go.
MX record
The entry in that directory that names the mail server for a domain.
Mail server
The computer that receives mail for a domain.
Bounce
A message that comes back saying the email could not be delivered.
Hard bounce
The address is wrong or no longer exists. Do not try it again.
Soft bounce
A temporary problem, such as a full mailbox. You can try again later.
Delivered
The email reached the receiving computer. It can still land in spam.
SMTP probe
A quick question to the mail server: would you accept this person? No email is sent. Many servers say yes to everyone, so a yes is not proof.
SPF, DKIM, DMARC
Settings that prove your organisation is allowed to send mail. Without them, mail is more likely to be blocked or marked as spam.
APPROVE
Safe to send. It passed every check.
REJECT
Do not send. It will bounce, or the address is not valid.
REVIEW
A person must decide before you send. Read the reason shown in the Rules column.
PENDING
Waiting for DNS results. It cannot be approved until they are imported.
Placeholder domain
A fake domain used in examples, such as example.com. It is never a real mailbox.
Typo domain
A well-known provider with a spelling mistake, such as gmai.com instead of gmail.com.
Disposable address
A temporary mailbox from a throwaway service. Often used for fake sign-ups.
Role address
A shared mailbox, such as info@ or sales@. Several people may read it.
Implicit MX
The domain has no mail directory entry, so mail falls back to its website. This is unusual, so check it.
Exception code
The reason you give when you decide a REVIEW address. For example, EX1 means the owner confirmed the address.
Note
Your reason, in your own words. At least 10 characters, saying what you checked.
Audit log
A record of everything anyone did, with the time and the person's name.
Accuracy
How often the tool was right. Right means: approved and delivered, or rejected and bounced.
Snapshot
A photo of every address's status at one moment, so you can see what changed later.
Tracker
A live list of delivered and undelivered addresses.
Team mode
Share one queue with your team over the internet.
Sign-in link
An email link that logs you in. There is no password to remember.
Publishable key
A public key that lets this page talk to your database. Safe to share. Never share the service_role key.
Row-level security
Rules in the database that say who can see and change each row. It keeps team data private.
Local mode
Everything stays in your browser. Nothing goes online.
State backup
A saved file of your whole queue. Keep a copy, in case the browser clears its data.

Accuracy check

After you send, paste the addresses that bounced and the ones that were delivered. The tool compares them with its verdicts and shows how accurate it was. Outcomes stay in this browser.


    

How is this working for you?

Rate the tool from 1 (not useful) to 5 (works well). Ratings stay in this browser unless you copy them.

Help and chat

Choose a topic, then a question. Take your time. You can also type a question. If the answer is not here, email us.

Still stuck?

Email the team: rchmadhumitha@gmail.com