Skip to the documentation
Knowledge base

Bring your old mailbox

Arrive with the mail you already have, whether an archive exported from wherever it lives now or the account itself, threaded as it was and filed where it belongs.

Not yet

There is no importer of any kind yet; the one part already solved is threading, because imported mail that keeps its original headers threads itself alongside mail that arrives later.

Details

  • Not shipped. Nothing here reads an mbox, an .eml file, a provider archive or an IMAP account, and there is no screen to start an import from. The parser that would do the reading is already a dependency and already runs on every message that arrives; what does not exist is anything that splits an archive into messages and hands them to it.
  • Threading needs no new work at all. A conversation is anchored on the first entry of a message’s References header, falling back to In-Reply-To and then to the message’s own id, the rule every other mail system uses, so an import that preserves those three headers reproduces the threads exactly, with no id-mapping table and no second pass. Imported mail then threads together with mail that arrives afterwards, because both go through the same function.
  • The delivery path is reusable and most of what it does has to be turned off. A message that arrives is scored for phishing, checked for AI authorship, summarised, embedded for search, indexed for files and broadcast to every open tab. Run eighty thousand old messages through that and it is eighty thousand model calls and eighty thousand notifications, so an importer belongs beside the disposable-inbox path, which already exists as the precedent for a deliberately quiet ingest, rather than as a fifth switch on the delivery one.
  • Old mail must not land in the inbox. A folder here is a label and nothing else, so filing eight years of archive is a matter of writing ARCHIVE instead of INBOX and UNREAD. The switch that does that today also suppresses delivery-report correlation as a side effect, so an import needs its own rather than borrowing it. Dates come off the message, so a thread from 2019 sorts as 2019 rather than as the day you moved.
  • Running the same import twice must not double the mailbox. Messages are already deduplicated on the pair of message id and sender rather than on any id generated here, so a re-run after a failure is safe by construction, which is what makes a resumable import possible at all. What is missing around it is the bookkeeping: a job record, a cursor, a count you can watch and a list of what did not come through.
  • Two ways in, and they are not the same size. A file you already hold needs a parser and a queue and nothing else, and every provider gives you one on request. Reading a live account over its own API needs an OAuth client, a consent screen, a review and a scope wide enough to read a whole mailbox, and that scope is the one this product deliberately gave up. The file is the path that gets you here with your history; the account is a separate decision about how much access to ask for.