Email network analyzer
Paste an mbox export, a single .eml, or just the headers and see who mails whom. The tool builds a weighted sender-to-recipient graph, ranks senders, recipients and correspondents, and exports CSV, JSON, GraphML, or Graphviz DOT — all in your browser.
About this tool
A mailbox is a social network hiding in plain text. Every message carries a From: address and one
or more To:/Cc: addresses, and that is all you need to reconstruct who talks to whom, how often,
and over what period. This tool reads that metadata out of raw email text and builds the graph.
Paste an mbox export (messages separated by a From postmark line), a single .eml file, or even
just the headers. Each message contributes one link from its sender to every distinct recipient,
weighted by how many messages travelled along it. You get message, participant, and link totals, the
date span, the top senders, the top recipients, the top correspondents by combined volume, and the
heaviest links with the first and last date each was used. Set Your address and the report adds a
personal section: who you mail most, who mails you most, and a reciprocity ratio.
Switch Nodes to domains for an organisation-level rollup, Link direction to undirected to
merge A → B with B → A, or Output to CSV, JSON, GraphML, or Graphviz DOT when you want to
load the graph into Gephi, NetworkX, or Graphviz instead of reading it here. Message bodies are never
parsed and nothing leaves the browser.
Worked example
Paste this three-message mbox:
From [email protected] Mon Jan 1 00:00:00 2024
From: Alice <[email protected]>
To: [email protected]
Cc: [email protected]
Date: Tue, 2 Jan 2024 10:00:00 +0000
Subject: kickoff
hello
From [email protected] Mon Jan 1 00:00:00 2024
From: Bob <[email protected]>
To: [email protected]
Date: Wed, 3 Jan 2024 09:00:00 +0000
Subject: re: kickoff
ack
From [email protected] Mon Jan 1 00:00:00 2024
From: Alice <[email protected]>
To: [email protected]
Date: Fri, 5 Jan 2024 11:30:00 +0000
Subject: status
update
With the defaults (address nodes, To: and Cc:, directed) the report opens with:
Email network
3 messages, 3 addresses, 3 links
View: directed graph of addresses, recipients = To+Cc
Dates: 2024-01-02 .. 2024-01-05
Alice leads the top-senders list with 2 messages to 2 contacts, Bob follows with 1, and the heaviest
link is [email protected] -> [email protected] with 2 messages spanning 2024-01-02 .. 2024-01-05.
Switching Link direction to undirected merges Alice→Bob and Bob→Alice into a single pair link
carrying all 3 messages; switching Nodes to domains leaves just example.com -> example.org,
because the mail inside example.com becomes a self-loop and self-loops are dropped by default.
Limits and edge cases
- Input is capped at 4 MiB and 20,000 messages. This is a paste-sized tool — split a multi-gigabyte archive before pasting, or filter it with From date / To date first.
- Rows per ranked list accepts 1–100; Minimum messages per link accepts 1–10,000. Neither affects the CSV, JSON, GraphML, or DOT exports, which always contain the full graph.
- A message needs a
From:header and at least one recipient address to count. Blocks that fail either test are skipped and tallied in the report's Notes section. - mbox splitting keys on a line starting with
From(with a space) at column 0. A body line that starts exactly like that will split a message in two — rare, but it is how the format works. - Dates are read from the
Date:header and compared as calendar days in the message's own timezone. While From date or To date is set, undated messages are skipped, not kept. - Recipients are de-duplicated per message, so someone listed in both
To:andCc:counts once. Bcc:normally survives only in your own sent mail; on received mailto-cc-bccbehaves liketo-cc.- Only addresses are read — no subjects, bodies, attachments, or
In-Reply-Tothreading. Centrality measures such as betweenness are out of scope; export GraphML and compute them in Gephi or NetworkX.
FAQ
Where do I get an mbox file to paste?
Most mail clients export one. Google Takeout returns Gmail as an .mbox, Thunderbird stores folders
as mbox files under its profile directory, and Apple Mail can export a mailbox to .mbox. You can
also paste a single .eml, or copy the header block ("show original"/"view source") of one message —
the tool only needs From:, To:, Cc:, Bcc:, and Date:.
What is the reciprocity ratio in the personal section?
It is the messages you received divided by the messages you sent, within the analysed set. Above
1.00 means more mail arrives than you send; below 1.00 means you are the one driving the
conversation. It only appears when Your address is set and you sent at least one message.
Why is my inbox showing barely any links?
An inbox is mostly mail addressed to you, so a directed graph of it is a star with you at the centre.
Two things help: analyse sent mail as well so the outbound half exists, and set Exclude
addresses containing to noreply,notifications@,mailer-daemon so automated senders stop crowding
out real people. Raising Minimum messages per link to 3 or 5 also strips one-off contacts.
What is the difference between address nodes and domain nodes?
Address nodes keep every person separate — the usual view for a personal mailbox. Domain nodes
collapse everything after the @, so all of [email protected] and [email protected] become
example.com. That gives an organisation-level picture of which companies talk to each other. Note
that internal mail then becomes a self-loop, which is dropped unless you tick Keep self-addressed
links.
How do I get this into Gephi or NetworkX?
Set Output to GraphML and save the result as network.graphml. Gephi opens it directly; in
Python, networkx.read_graphml("network.graphml") gives you a graph whose edges carry a weight
attribute (the message count) and whose nodes carry label, sent, and received. The
edgedefault attribute follows the Link direction setting. The DOT output is the same graph for
Graphviz: dot -Tsvg network.dot -o network.svg.
Is my mail uploaded anywhere?
No. The parser and the graph builder are compiled to WebAssembly and run inside this page, so the pasted text never leaves your machine. The same Rust code runs locally in the CLI. There is no account, no mailbox connection, and no server-side storage.
Developer & Automation Access
Run it from the terminal
Same engine as this page, headless — via the gizza CLI:
gizza tool email-network-analyzer "From: Alice <[email protected]>
To: [email protected]
Cc: [email protected]
Date: Tue, 2 Jan 2024 10:00:00 +0000
Subject: kickoff
hello"New to the CLI? Get gizza →
Open it by URL
Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:
https://gizza.ai/tools/email-network-analyzer/?input=From%3A%20Alice%20%3Calice%40example.com%3E%0ATo%3A%20bob%40example.com%0ACc%3A%20carol%40example.org%0ADate%3A%20Tue%2C%202%20Jan%202024%2010%3A00%3A00%20%2B0000%0ASubject%3A%20kickoff%0A%0Ahello&me=alice%40example.com&nodes=address&recipients=to-cc&direction=directed&top=10&min_messages=1&exclude=noreply%2Cnotifications%40%2Cmailer-daemon&self_loops=true&since=2024-01-01&until=2024-12-31&format=reportMachine-readable descriptor: tool.json — title + parameters JSON Schema for agents.
