GenMail
Generic Email Client. A pure-Swift IMAP and SMTP client that talks to any standards-compliant mail server. A single privacy level sets how much a message is allowed to do when you open it, from full HTML rendering down to plain text that never touches the network.
A mail client decides on your behalf how much a message is allowed to do when you open it: load remote images, pull external stylesheets and fonts, or report back that you read it. Most clients scatter those decisions across a settings pane, or do not offer them at all. GenMail puts them on a single control, and the rest of the app follows from where that control sits.
how it works
- One privacy level sets around sixteen behaviours together: HTML rendering mode, remote content policy, tracking-parameter stripping, whether outbound headers identify the client, whether the Message-ID carries your hostname, and the minimum TLS version. Any individual setting stays overridable, the way a single pref can be flipped behind Tor Browser’s slider.
- HTML renders in a WKWebView behind a generated Content-Security-Policy, with
a navigation delegate applying the same rule independently, so one mistake in
the policy string cannot leak a tracking pixel. The plain-text converter is
hand-written because
NSAttributedString(html:)resolves remote resources while parsing, which would defeat the strictest level. - Sync uses IMAP QRESYNC and CONDSTORE: a SELECT returns changed flags and deleted UIDs since the last modification sequence, instead of diffing UID lists. One pooled connection per account, and IDLE for near-instant delivery while the app is open.
- Adding an account needs an address and a password. The servers are discovered from the domain’s own autoconfig, then proved against the real hosts before anything is written.
- A TOML file is the source of truth on both platforms. The settings screen edits it in place, so comments, spacing and key order survive a round trip.
interface
Built without platform vocabulary. No SF Symbols, no system list styling, no translucent chrome. Human text is set in a serif and runs left; machine facts, meaning dates, counts, flags and hosts, are monospaced and flush right in fixed columns. Eight invariants are enforced by a script rather than by memory, among them that the accent colour is never applied to text and that an unavailable action states its blocking reason instead of greying out.
status
Reading, sending, threading, search, attachments, drafts, an outbox with an
undo window, and multi-account are all working and in daily use. 158 tests.
Two macOS builds ship from one codebase: a sandboxed one for the App Store and
an unsandboxed one that reads its config straight from ~/.config.
Not released. Outlook accounts cannot be added, because authentication is password-only and Microsoft removed basic auth for personal accounts; Gmail works with an app password. The sync engine has no tests of its own, and the IMAP layer has only ever been exercised against one provider.