Features
A mailbox in the browser that knows nothing but your bucket: folders are S3 prefixes, state sits next to the mail, and what you sort, the second machine sees too.
- Reading: index by range GET, HTML in a sandbox, images blocked, an SPF/DKIM/DMARC mark only on failure
- Writing: replies in the thread, Bcc, attachments, no double send after a crash
- Sorting: folders, tags, rules with evidence-based suggestions, search with filters, several mailboxes
Folders are real S3 prefixes
--prefix mail/ is the root. What sits directly below it is the inbox; subfolders are mail folders:
mail/ ← prefix from the SES receipt rule = inbox
mail/archive/ ← archive
mail/spam/ ← spam
mail/trash/ ← trash
mail/sent/ ← a copy of every sent mail
mail/drafts/ ← drafts, including Bcc and attachments
mail/customers/ ← created by you
mail/.s3mail-state.json ← tags, read/unread, star, rules (snapshot)
mail/.s3mail-state/ ← the individual changes since the snapshot
Moving is CopyObject + DeleteObject. You see the folders in the S3 console, and the trash can be emptied by a lifecycle rule. The message id is the basename, not the full key; that is why everything you know about a mail survives moving it between folders.
Reading
- When indexing, s3mail fetches only the first 64 KB of each mail with a range GET, enough for headers and preview text. Sync over ETags, eight parallel requests. “Reload” fetches only what is new.
- HTML mail renders in a
sandbox=""iframe with a CSP. Remote images are blocked until you load them: they would send every sender a read receipt. - Attachments download individually, the raw mail as
.eml. Images and PDF open in a preview, everything else is download only, SVG explicitly included: it looks like an image but is XML with script support. - SES verdicts (
X-SES-Spam-Verdict,X-SES-Virus-Verdict) as a badge. - SPF, DKIM and DMARC from
Authentication-Results: a mark appears when one of the three checks failed. No tick on every mail, because a mark that is always there is soon looked at by nobody. Only the topmost header namingamazonses.comis believed; any sender can write one withdkim=passinto the mail themselves.
Writing
- Reply, forward, new message. Replies hang on the original's thread via
In-Reply-ToandReferences. - The signature sits above the quote and lands in the text field rather than at send time, so it can be trimmed first.
- Addresses are suggested as you type, from the index, not from an address book: a second place for addresses is a second place for them to be wrong.
- Attachments, Cc and Bcc. The Bcc goes to SES through the recipient list and never appears in the mail's header. More than 10 MB is refused before uploading; that is the SES limit.
- Every sent mail sits as a copy in
sent/. - No double send after a crash. Before SES is asked, s3mail places a note next to the draft and only strikes it out once copy and draft are done. If the program dies in between, the next start finishes what is certain; if it stays open whether SES took the mail, a bar above the mailbox asks instead of sending it a second time.
- Drafts sit as real mail in
drafts/, including Bcc and attachments, and are visible from the second machine too. - Text snippets per mailbox in the configuration, inserted at the cursor position.
Sorting, rules, search
Sorting
- Create folders and move mail, trash, spam, archive. Permanent deletion only from the trash and only after confirmation, enforced server-side.
- Tags with colours, several per mail; read/unread with a counter per folder; star.
- Multi-select with shift-click. The checkbox in the toolbar selects every hit of the current search: “everything from news@shop.io to the archive” is two clicks. If one mail gets stuck, the others still move, and the message names the number that actually arrived.
Rules
“Contains X in From/To/Subject/anywhere → folder + tags”, applied to new mail when indexing, first matching rule wins. A mail is sorted automatically only once; if you move it back, it stays. The automation never touches trash and spam.
Rule suggestions show what you already do by hand: “You moved 11 of 12 mails from news@shop.io to Advertising.” That rests on evidence, not taste: at least four mails from the same sender and at least 80 % of them in the same folder, the numbers shown alongside. Sender, folder and tags are evaluated, never a mail's content, without a network connection and without an API key. Rules and tag colours export as JSON; the import merges and never replaces.
Search
Free words in From/To/Subject/preview/tags, plus combinable filters:
invoice from:client@x.com subject:"Quote" after:2026-01-01 before:2026-08-01
has:attachment has:spam is:unread is:starred tag:important in:archive
The + in the sidebar remembers your own filters under a name. Like tags and rules they live in the bucket: the second machine sees them, and none of it disappears when somebody clears the browser cache.
For client work
Awaiting reply: what went out at least five days ago and nobody answered, longest wait first. Answered is judged by address, not by thread: a reply often arrives as a new mail, from a colleague of the person written to, or with a thread a ticket system cut off. History in the mail view shows every mail with that address across all folders.
Keyboard:n new message · j/k move · x select · s star · e archive · Del trash · / search.
Several mailboxes, three languages
One s3mail serves any number of mailboxes, info@ and support@ in the same bucket or in different AWS accounts, each with its own sender, signature and state. If one fails at start, the others come up anyway. The interface speaks German, English and Spanish; the search terms work in all three (from: as von: as de:). Folder names are real S3 prefixes and are only displayed, not translated.
Next
Access, encryption, state
The three checks on every request, encrypted buckets, shared state without a lock.