Gmail can find exactly the right messages. Google can export everything you own. Nothing connects the two.
There is no "select these search results, export the senders to a spreadsheet" button anywhere in Gmail. That is the honest starting point, and it is why this question gets asked so often.
So the question is not how do I press the button. It is which of four workarounds fits what you are actually trying to do.
| Route | Good for | Costs you |
|---|---|---|
| Other contacts | Everyone you have ever emailed | Three clicks, but no filtering at all |
| Contacts export | A clean CSV of saved contacts | Contacts only, not correspondents |
| Google Takeout | A full mailbox archive | An archive file, not a list |
| Apps Script | Addresses from a specific search | An afternoon, and it will time out |
| An add-on | The same, without the afternoon | Free tiers are capped |
Work down that table in order. Most people who land on this question are looking for row one and have never heard of it.
1. Other contacts — the free answer most people never find
If you have emailed someone and never saved them, Google has probably saved them for you already. Google Contacts calls this Other contacts, and it is the fastest route by a distance.
- Go to
contacts.google.com - In the left sidebar, click Other contacts
Google's own description: "If you email someone but you haven't added them as a contact, Google Contacts automatically saves their email address in your 'Other contacts' group."
Two things nobody mentions.
It is desktop only. Google states plainly that on iPhone, iPad or Android you will not see Other contacts at all.
And it can be switched off — in two separate places. Your Google Account under People & sharing → Contacts → Contact info saved from interactions, and in Gmail under Settings → Create contacts for auto-complete, where one of the options is "I'll add contacts myself."
If Other contacts is empty, one of those settings is why. It is also worth checking before you conclude the feature is broken.
The catch is that Other contacts is everything, in one undifferentiated pile. There is no filtering, no date range, no "only people from this label." If you want some of your correspondents rather than all of them, keep reading.
2. Export your contacts to CSV
Once the people you want are actually in Contacts:
- Go to
contacts.google.com - Tick the contacts you want. For everything, tick any contact, then top-left Selection Actions → All
- Top right, More actions → Export
- Choose Google CSV
- Click Export
That CSV opens straight in Google Sheets or Excel.
The limitation is real, and it is the same one as above. This exports contact records. It has no idea what is in your mail, so it cannot answer "everyone I emailed under label:clients in the last six months." Contacts and Gmail are separate products that happen to share an account.
3. Google Takeout — the route that sounds right and isn't
Takeout at takeout.google.com exports Gmail in three steps: Select data → Customize archive → Receive archive. What comes back is message content, headers and attachments — the whole mailbox, in a mail-archive format built for importing into another mail client.
It is a genuinely good backup. It is a poor address list:
- No column structure. It is not a spreadsheet and does not become one. Getting addresses out means parsing the archive yourself.
- No deduplication. A contact who appears in 40 threads appears 40 times.
- No real scoping. You can choose which labels to include, but not "only the last six months" or "only from this sender."
- Not instant. Google notes the export "could take from a few minutes to a few days" depending on account size. Encrypted messages stay encrypted.
Takeout is the right tool for backing up or migrating a mailbox. It is the wrong tool for building a list.
4. Apps Script — full control, and a six-minute wall
This is the DIY route, and the first one that actually matches the job. The Gmail service in Apps Script gives you everything you need: search your mail, walk the matching threads, read the From, To and Cc fields off each message, write the results to a Sheet.
The scoping happens in the search string — and the same string works in the Gmail search box, in Apps Script and in the Gmail API, so you only ever learn it once:
label:clients newer_than:6m has:attachment
The operators worth knowing
| Operator | What it does | Example |
|---|---|---|
label: | Restricts to one Gmail label | label:clients |
from: | A sender, or a whole domain | from:@acme.com |
to: | Messages sent to an address | to:sales@yourcompany.com |
cc: | Messages where an address was copied | cc:me |
newer_than: | Relative recency | newer_than:6m |
older_than: | Everything before a point | older_than:2y |
after: / before: | Absolute date bounds | after:2026/01/01 |
has:attachment | Only messages with files attached | has:attachment |
list: | A mailing-list address | -list:news@example.com |
category: | One of Gmail's inbox categories | category:primary |
list: is the underrated one. Prefixed with a minus, it is the clean way to drop a newsletter you keep accidentally collecting.
Combine freely. label:conference-2026 newer_than:3m has:attachment is a real, useful list. in:anywhere is not — it drags in Spam and Trash.
Check the result count in Gmail before you write a line of code. If the query returns 4,000 threads, it is too loose, and the sheet will be noise regardless of how good the script is.
Three things will bite you
- The address fields are strings, not arrays.
getTo()andgetCc()return one comma-separated string, and each value arrives as"Display Name" <addr@example.com>. You are splitting, trimming and parsing before you have anything usable. - Six minutes. Apps Script kills any single execution at six minutes. A large mailbox needs batching with a stored cursor and a time-driven trigger — which is most of the afternoon this route costs you.
- Daily read quotas. 20,000 on a personal Gmail account, 50,000 on Google Workspace.
None of these are dealbreakers. They are the reason this route takes an afternoon rather than ten minutes.
Where Contact Extractor fits
Contact Extractor is route four without the afternoon. It runs as an Apps Script add-on inside your own Google account, takes the same Gmail search syntax, and writes the results into a Sheet, deduplicated.
It exists because of the specific gap this page describes: Takeout hands you an archive, and Contacts cannot see your mail. That gap is the whole product.
Step 1: Test the query in Gmail
Build the search in Gmail first, where you can see the results before committing to anything, exactly as above.
Step 2: Open the add-on in the destination Sheet
Create or open the Google Sheet you want the list to land in:
Extensions → Contact Extractor by 8apps → Open App
Step 3: Recreate the search as filters
Enter the same scope you just tested — Gmail label, From, To, Subject, after/before dates, plus any advanced operators under Advanced Options.
A live Gmail-compatible query is assembled as you type, and Verify opens it in Gmail so you can confirm you are looking at the same message set you tested. This is the step that catches a mistake before it becomes a 4,000-row sheet.
Step 4: Choose which fields to read
Rather than dumping whole messages, you choose which parts of each message to read. Each match returns the email address and the name attached to it:
| Field | Use it when |
|---|---|
| From | You want the people who wrote to you |
| To | You want the people a message was addressed to |
| CC | You want everyone looped into a thread — often the widest useful net |
| BCC | You are working through your own sent mail |
| Reply-to | Senders route replies to a different address than they send from |
| Subject line | Addresses appear in subjects, e.g. forwarded enquiries |
| Message body | Addresses are written in signatures or inside the message text |
Start narrow. From and CC cover most real cases. Adding Message body widens the catch considerably, but also pulls in every no-reply address written into a footer.
Step 5: Exclude your own domain
Put your own domain in the Exclude domains field — just yourcompany.com, not a full address. Without this, a large share of most exports is your own colleagues.
Step 6: Save and extract
Addresses are written into the Sheet, deduplicated as they go. Someone who appears across 40 threads appears once.
If the underlying message set keeps growing — a live label, a shared alias, an ongoing campaign — set the task to run hourly and the Sheet stays current on its own.
→ Contact Extractor on the Google Workspace Marketplace
Cleaning up the sheet
Whichever route you took, a cleanup pass is worth it:
- Filter out no-reply addresses.
=FILTER(A2:A, NOT(REGEXMATCH(A2:A, "(?i)no-?reply|donotreply"))) - Group by domain to see which companies are actually represented:
=ARRAYFORMULA(IFERROR(REGEXEXTRACT(A2:A, "@(.*)$"))) - Re-check for duplicates if you have combined several exports:
=UNIQUE(A2:A)
Before you email any of it
Extracting addresses from your own mailbox is a records exercise. Emailing that list is a marketing act, and only the second one is regulated.
Google's sender guidelines are blunt: "Don't send messages to people who didn't sign up to get messages from you", and "Don't purchase email addresses from other companies."
The FTC is equally clear that there is no business-to-business carve-out — "The law makes no exception for business-to-business email" — and it lists automated address collection among the aggravated violations under CAN-SPAM.
The practical version: keep the people you have genuinely corresponded with. Drop list: matches, no-reply senders, and addresses that only ever appeared in a CC chain. A list built from real correspondence is both more defensible and considerably more likely to get a reply.
A note on permissions
Any tool that reads your Gmail will ask for Gmail access through Google's own consent screen, and you should read what it asks for. Two things worth checking on anything you install:
- Does it process your mail inside your Google account, or send it to a third-party server?
- Has it been through Google's security review?
Contact Extractor runs as an Apps Script add-on in your own Google account, writes only to the Sheet you choose, and is CASA 2 certified. It reads the messages your filters match, and only the fields you select — pulling the email addresses and names it finds there, and nothing else.
Which route should you use?
| You want to… | Use |
|---|---|
| Everyone you have ever emailed, no filtering needed | Other contacts |
| A CSV of contacts you have already saved | Google Contacts → Export |
| Back up or migrate an entire mailbox | Google Takeout |
| Addresses from a specific search, and you can code | Apps Script |
| Addresses from a specific search, and you cannot | An add-on |
| Three addresses from one thread | Copy and paste, honestly |
The last row matters. Not every job needs a tool.
Sources
- Export contacts – Google Contacts Help
- Add or move contacts / Other contacts – Google Contacts Help
- Change who's saved & suggested as contacts – Google Contacts Help
- Download your Google data and Download Gmail data
- Search operators you can use with Gmail
- Apps Script – GmailMessage reference and Quotas for Google Services
- Email sender guidelines – Gmail Help
- CAN-SPAM Act compliance guide – FTC