Email Extractor

Paste an email thread, a web page, a log file or a spreadsheet dump, and every address in it comes back as a tidy CSV. Duplicates go, case is normalized, the punctuation the sentence left attached comes off, and anything that fails the checks a real mail server would apply is reported rather than quietly kept. Nothing is uploaded.

No text handy? Hit Try an example above and a realistic email thread loads and runs.

The regex is the easy part

Everybody knows the shape of an email address, and everybody can write a pattern that matches one. What separates a tool you can use from a regex you found on a forum is everything that happens either side of the match, because real text does not hand you addresses on their own.

  • Sentences put punctuation on the end. Write to ada@example.com. matches with the full stop attached. So does (grace@example.org), with a bracket and a comma. A greedy character class cannot tell the difference at match time, so this page trims trailing punctuation afterwards, one character at a time, until the address ends in something that can legally end an address.
  • Mail clients wrap them in angle brackets. Ada Lovelace <ada@example.com> is how every quoted reply and every From: header writes it. The brackets are not part of the address and the display name is not either.
  • The same mailbox appears in six spellings. A thread with ten replies contains the same address ten times, and half of them are title-cased because somebody's client did that. Deduplicating on the raw text removes none of them.
  • Some of what matches is not deliverable. ada@example has no dot in the domain. ada..b@example.com has two dots in a row in the local part. ada@example.c0m has a digit in the top-level domain. All three match a naive pattern and all three bounce.

Worked example: a thread with ten matches and seven real addresses

Here is the first half of the sample this page loads. Read it as a person and count the distinct mailboxes.

From: Ada Lovelace <ada.lovelace@example.com>
To: grace.hopper@navy.example.org, Alan Turing <a.turing@bletchley.example.co.uk>
Cc: billing@example.com; billing@example.com

Thanks all. Katherine (k.johnson@nasa.example.gov) will send the figures on
Friday, and anything about the invoice should go to Billing@Example.com rather
than to me. The old address ada@example is dead, please drop it.

Ten runs of text match an address pattern across the whole sample. With the defaults on, seven rows come out, and the summary strip above the table says exactly what happened: ten found, two duplicates removed, one skipped, seven in the output, six distinct domains.

email
ada.lovelace@example.com
grace.hopper@navy.example.org
a.turing@bletchley.example.co.uk
billing@example.com
k.johnson@nasa.example.gov
edsger.dijkstra@tue.example.nl
radia.perlman@example.net

Three things worth pulling out of that. billing@example.com appeared three times in two different cases and collapsed to one row. ada@example was dropped with a note naming the reason, "the domain has no dot in it", rather than silently vanishing. And edsger.dijkstra@tue.example.nl. lost its trailing full stop, which is the single most common way a copied list of addresses turns out to be unusable.

Tick Domain column and a second column appears holding example.com, navy.example.org and so on. That is the column you group by when the question is "how many of these are at customer domains and how many are free mail".

What the syntax check actually checks

Not the full RFC 5322 grammar. The full grammar permits quoted local parts with spaces in them, comments in parentheses inside the address, and domains written as bracketed IP literals. All of that is legal, essentially none of it is real, and a validator that accepts it rejects nothing useful.

What is checked is the set of rules a receiving mail server enforces:

  • The part before the @ is between 1 and 64 characters, does not start or end with a dot, and has no two dots in a row.
  • The domain is at most 253 characters, contains at least one dot, and no label in it is empty, longer than 63 characters, or starts or ends with a hyphen.
  • The top-level domain is two or more letters with no digits. This is what catches example.c0m and example.1.

Anything that fails gets a sentence naming the rule it broke, and the first three failures are quoted back at you in the warning. If you want the failures anyway, because you are cleaning a list rather than sending to it, switch the check to Keep everything and every match comes through untouched.

Deduplication is case-insensitive whatever the lowercase setting says

This is a small decision with a real consequence, so it is worth stating plainly. Ada@Example.com and ada@example.com are one mailbox. Mail domains are case-insensitive by specification, and while local parts are technically allowed to be case-sensitive, no mail provider in general use treats them that way.

So when you ask to remove duplicates, they are matched on the case-folded address, and the first spelling in the document is the one kept. Turning off Lowercase changes what is written to the output, not what counts as a duplicate. A tool that kept both because the bytes differed would be technically defensible and useless.

Order is document order throughout, unless you ask for sorting. That matters more than it sounds: when you are reconciling an extracted list against the source, an output that silently reordered is an output you cannot check.

Where the addresses usually come from

  • A forwarded thread. Somebody needs the distribution list out of a chain of replies, and copying them by hand out of the quoted headers is the kind of task that produces one typo per twenty addresses.
  • A web page or an HTML export. Paste the rendered text or the source; mailto: links and plain text both work, and the surrounding markup is ignored.
  • A CSV with addresses buried in a free-text column. Notes fields collect contact details. Paste the column, or drop the whole file, and the addresses come out regardless of which column they were in.
  • A log file or a bounce report. Delivery logs mention the recipient dozens of times per message; the deduplication is doing most of the work here.
  • A PDF you have already turned into text. If it is still a PDF, run it through the PDF reader first.

Files up to 100 MB can be dropped straight in, and there is no row limit under that. Past 100 MB the browser tab is the wrong place to be doing this and the widget says so.

One thing this deliberately does not do

It does not tell you whether an address is real. That needs an SMTP conversation with the receiving server, which cannot happen from a browser tab and which most providers now answer identically for existing and non-existing mailboxes anyway. Any free tool claiming to verify deliverability from a paste box is guessing, usually by checking the domain has an MX record, which tells you the domain accepts mail and nothing at all about the mailbox.

What this page gives you is a clean, deduplicated, syntactically valid list with its domains broken out. Verification is a separate job for a service that can actually talk to a mail server.

Frequently Asked Questions

Why did an address I can see in the text not come out?

Almost always the syntax check. Look at the amber note above the table: it quotes the first three rejected addresses with the rule each one broke. The usual culprits are a missing dot in the domain, a digit in the top-level domain, and a local part that starts or ends with a dot. Switch the check to "Keep everything" and it will come through.

Does it handle plus addressing and subdomains?

Yes to both. ada+newsletter@example.com is valid and comes through with the tag intact, because the tag is meaningful to the receiving server. grace@mail.eu.example.org is valid too, and its domain column reads mail.eu.example.org rather than being trimmed back to the registrable domain.

Can I extract from a file rather than pasting?

Yes. Drop a .txt, .log, .csv, .eml, .md or .html file on the box, or click to browse. The file is read in the tab exactly the same way pasted text is, and the same options apply. Up to 100 MB, with no row limit under that.

What does the domain column give me that a spreadsheet formula would not?

Nothing you could not compute, but the column is there before you open the spreadsheet, spelled consistently in lowercase, and with any www. prefix already gone. The summary strip also counts the distinct domains for you, which is usually the number you actually wanted.

Are the addresses in the order they appeared?

Yes, unless you tick "Sort A to Z". Document order is the default because a list you can reconcile against the source is worth more than an alphabetized one, and sorting is one click away when you want it.

Is there a limit on how many addresses it will pull out?

No count limit. The limit is the 100 MB file size the in-page tools share. A hundred megabytes of email thread holds far more addresses than anyone has ever needed from one paste, and there is no sign-up, no daily quota and no watermark on any of it.

Does anything I paste leave my computer?

No. There is no upload endpoint on this page and no network request in the code that does the work. JavaScript in your own tab reads the text, processes it and hands back the result. Nothing is stored between visits either, so reloading gives you an empty box again. You can confirm it by opening your browser's network panel and watching it stay quiet while you work.

Get the addresses out

Free, no account, no upload, no daily allowance. Paste the text, take the CSV.

Back to the extractor