Email Feed
The email feed makes mail searchable. We give you an address; you add one forwarding rule in your own mail system; every message that arrives becomes a searchable record, within seconds.
We never connect to your mailbox. There is no OAuth consent screen, no app to approve, no password or token to paste, and nothing for you to revoke later — because we hold no credential of yours at any point. You keep the tap: delete the forwarding rule and the feed stops, without asking us. This works identically on Gmail, Microsoft 365, Fastmail or anything else that can forward, because forwarding is the only thing it needs.
This page covers what’s specific to email. For how feeds work in general — binding a list, deleting — see the Feeds reference.
Connect an email feed
- Go to Feeds (under Sources in the sidebar), click Connect feed and choose Email.
- Give the feed a name, choose the list messages should be imported into (create the list first if you haven’t — unlike other feeds, mail imports straight into it), and enter the sender domains you’ll be forwarding from — normally your own, e.g.
acme.com. - Click Connect. The feed’s page then shows your ingest address, something like
acme.k7f3q9x2mp4arstv@ingest.searchstack.dev. - In your mail system, forward to that address (see below). The next message that arrives is searchable seconds later.
Setting up the forwarding rule
Where to set the rule depends on your provider, and in both of the big ones an administrator may have to allow forwarding to an outside address first — that restriction is theirs, not ours.
- Microsoft 365 / Outlook — a mailbox rule with the action Redirect the message to, rather than Forward. Redirect keeps the original sender, date and subject intact, which is what you want in your search results. Automatic forwarding to external addresses is blocked by default across a tenant, so an admin may need to permit it.
- Gmail / Google Workspace — Settings → Forwarding and POP/IMAP → Add a forwarding address, then either forward everything or add a filter that forwards only what you want. Google sends a confirmation code to the address first; it will arrive as a record in your list, where you can read the code and confirm. Workspace admins can restrict forwarding to approved domains.
- Anything else — any provider that can forward or redirect works, including a plain mail client rule.
You can also simply Bcc the address on individual messages, or forward one by hand, when you only want particular mail searchable.
Who is allowed to send
An ingest address is a way of writing to your list, so two things protect it:
- The address is unguessable. Half of it is a random token issued when the feed is created. If it ever leaks, re-create the feed to get a new one.
- Sender pinning. Mail is only accepted from the domains you listed at connect time — anything else is rejected and never reaches your list. This is why the field is required: an address with no pinned domains would accept nothing at all, which is the safe way round.
What ends up in each record
One message is one record — not one thread. Threads are assembled differently by every mail client and exist differently in every participant’s mailbox, so instead each message carries a thread_id and you group by it when you want the conversation.
| Record field | From | Role |
|---|---|---|
| name | the message’s Subject (or (no subject)) | the record’s display name |
body | the message text, with quoted history removed | searchable & embedded |
thread_id | the conversation the message belongs to | facet (group a thread together) |
from_address, from_name | the original sender — not whoever forwarded it | facet |
to_addresses | To and Cc, folded into one value | searchable |
sent_utc | the message’s own Date, in UTC | facet (filter & sort by date) |
has_attachments | whether anything was attached | facet |
received_utc | when we received it | facet |
The message’s own Message-ID is its stable identity. That means forwarding the same message twice — or forwarding it now and importing it again later from an export — updates one record rather than creating duplicates.
Quoted history is stripped. A ten-message thread would otherwise contain the first message ten times, and every search would match every message in the thread. We cut each message at the reply marker (“On <date>, <someone> wrote:”, “-----Original Message-----”, and the other common ones), keeping what the sender actually wrote. It is right the overwhelming majority of the time; an unusual client’s format may occasionally leave a quoted tail behind.
Attachment content is not indexed in this version — only the fact that a message had attachments. To search documents, put them in a media store and use the media store feed.
Three things forwarding cannot do
Worth knowing before you set this up, because none of them is a bug and all three follow from how forwarding works:
- Sent mail isn’t included. Mail rules run when a message is delivered, and nothing delivers your own outgoing mail to you. If replies matter to you, Bcc the ingest address when you send.
- Nothing before today. Forwarding only ever applies to mail that arrives after you set the rule; older mail is untouched.
- Deletions don’t reach us. Deleting a message in your mailbox doesn’t remove the record — we’re never told. Delete the record from the list if you want it gone.
A worked example
Say your team wants its shared support@acme.com mailbox searchable. You create a support-mail list, connect an email feed to it pinned to acme.com, and get an address. In Microsoft 365 you add one rule on the shared mailbox: redirect every message to that address. From then on every incoming support email is searchable within seconds — filterable by sender and date, groupable into threads — with no mailbox credential shared with anyone, and no code.