A desktop mail client for Microsoft Exchange and standard IMAP mailboxes, built around three things: finding mail fast, keeping mail you own on your own device, and getting through the day — with the look and muscle memory of a code editor.
// version 1.10.26 · macOS (Apple Silicon) & Windows
Most mail clients are a window onto a server. MailCode is a mail client with a local full-text archive underneath it, and almost everything that makes it different follows from that: search that answers in milliseconds over years of mail, an archive you keep after the server has let go of it, and a mailbox you can empty without losing anything.
Three things it is built for:
f:, s:, b:, a:, in:, src:), exact phrases, proximity (~N), date ranges, AND / OR — and plain questions like find phone number of Alice Chen, answered out of your own mail without sending anything anywhere. See Search..pst files beside it. Nothing needs a network to be found again. See The local archive.The look is the fourth thing, not the first: an activity bar down the left, an explorer of folders and labels, a dense scannable list, a clean reading pane, monospaced and colour-coded throughout. It is there because a code editor is a good shape for reading a lot of text quickly — not because mail is code.
It speaks two protocols:
Both account types can be connected at once, and mail from all of them merges into All Mail.
The window is divided into four regions, left to right:
| Region | What it does |
|---|---|
| Activity bar | The narrow icon strip on the far left switches the whole workspace between Mail, Flags, Contacts, Notes, and Calendar. Settings and Accounts live at the bottom. Hover any icon for its shortcut (e.g. Ctrl+1 for Mail). |
| Explorer | Accounts, folders, labels, and flag groups — the collapsible tree that scopes what the list shows. |
| Message list | The current folder or view, grouped by conversation (or by date). Unread rows are brighter; a blue dot marks unread threads. |
| Reading pane | The selected message, its participants, labels, attachments, and the action toolbar. |
The search box sits in the title bar, in the middle, because it is the control you reach for most. To its right, two badges appear only when they have something to say: scheduled mail waiting in the Outbox, and flags or reminders now due. Click either to open it.
The status bar along the bottom always shows the current folder, unread count, connection type, and encoding — plus a live line for whatever background job is running (syncing, importing, backing up, moving).
The connection item is also where a mailbox says it is being held back rather than failing. ⏳ rate-limited, retrying means the server has refused a call for a while and named how long — Microsoft does this to a busy or newly added Outlook/Hotmail mailbox — so MailCode waits it out and comes back, instead of reporting an error for something that is not one. A genuine failure still reads ⚡ sync error, and an expired sign-in reads authentication failed and raises the banner that fixes it.
The tree is ordered so the things you open most sit highest:
Click into the sidebar and the arrow keys walk the whole tree; Enter opens the highlighted row.
The list is built for acting on many messages at once:
The main window keeps tabs, so a folder, a search, and an open message can stay side by side. Ctrl+Tab cycles the main window and any open compose windows (add Shift to go back).
Each tab holds its own search: the query in the box, its date range and the list chips are restored as you move between tabs, so a search run in one tab never rearranges the list you are reading in another. A tab opened beside the one you are in (Cmd/Ctrl- or middle-click a folder, or the + button) starts on the query you already had; a tab opened by Find Related… starts on that search alone.
Composers, Settings, previews and the other panels behave like windows rather than a fixed stack: whatever you opened last comes to the front, and clicking either one raises it — including a click inside the quoted message you are answering point by point. So Settings opened while a draft is up is reachable without minimising the draft, and going back to the draft is a click on it. A full-screen composer is the one exception: it draws over everything, so nothing is put behind it.
Panels that Settings itself opens — the storage panel, What's New, Report a Problem — replace it on screen rather than stacking on it, and closing one puts Settings back on the tab and at the scroll position you left it, instead of dropping you into the mailbox.
Open Settings → Accounts → Add Account (or the Accounts icon at the bottom of the activity bar). MailCode supports three sign-in paths.
https://mail.company.com/EWS/Exchange.asmx), username, and password.For Microsoft accounts that require modern authentication, MailCode signs you in through the system's own sign-in window (your browser on Windows) and never sees your password — it receives only a scoped token for IMAP and SMTP. Configure this under Settings → Microsoft Account.
Each account card in Settings → Accounts carries its own switches, so one mailbox can behave differently from another:
| Control | What it does |
|---|---|
| ★ Default | This account opens on launch. |
| ✈ Go Offline | Pauses syncing for this account — you keep browsing its local mail, nothing is fetched or sent from it. |
| ⊘ Harvest Off | Stops adding addresses from this account's mail to Contacts. |
| Attachments | Per-account override of the global Attachment downloads setting. |
| Keep locally | Per-account override of the global Keep mail locally window. |
| 🗂 Browse | Lists this account's locally stored folders and message counts; click one to open it. |
The search box in the title bar is the fastest route to anything in MailCode. It searches subject, sender, recipients, and body, across both your live mailbox and everything stored on this device, and it answers from a full-text index rather than by scanning — so the archive being large is not the same as search being slow.
Type a query and press Enter.
Three sources are searched, and the chips beside the box tell you which:
af:/at: possible.| Chip | What it does |
|---|---|
| All folders / This folder | Only while a query is active in a single-folder view. This folder searches what is on screen; All folders searches every local folder including the local archive — which is how you find the copy filed in Sent Items or in a local year folder. |
| All sources / Local only / Cached only / Imported only | Which copy of the mail to show. It writes and reads the src: token, so clicking the chip edits the box and typing src:local moves the chip. One filter, one place it lives. |
Results are highlighted in the list and in the message body — in the neutral grey a code editor uses for a find hit, or any colour you pick under Settings → Appearance → Search highlight. Grouped results expand and collapse.
dd:, df:, dt:, af:, at:) and a calendar opens for it.s: per word, reply prefixes stripped) and runs it in a tab of its own, named after the subject — the tab you asked from keeps its own search, and closing the search tab puts you back in front of the message. Asking again for the same subject returns to that tab instead of opening a second one.f:, t:, and cc: autosuggest from your contacts as you type.label: and flag: autosuggest from your own labels and flags.| Prefix | Searches |
|---|---|
| f: | From — sender name or address |
| t: | To line only |
| cc: | Cc line only |
| s: | Subject contains (s= for an exact subject, ignoring Re: / Fwd: and punctuation) |
| b: | Body text only |
| a: | Attachment file name |
| in: | The folder the message is filed under |
| dd: | Sent on a day, month, or year |
| df: / dt: | Sent on or after / on or before |
| af: / at: | Added to the archive on or after / on or before |
| src: | Which copy — local, cache, import, archive, or all |
| label: | A label, and its sublabels — the same filter as clicking the label in the explorer |
| flag: | A flag |
Long forms work too (from:, to:, cc:, subject:, body:, attachment:, folder:, source:); label: and flag: also answer to lbl: and flg:.
Notes that save time:
bud finds budget. They do not search the To or Cc lines; use t: or cc: for those.s:"New Design System RFC-014" — otherwise only the first word belongs to the token.dd:2025 is the whole year, df:2025-03 is from the start of March.src: spellings are generous — src:server, src:synced and src:mirror all mean cache; src:pst and src:eml mean import; src:moved means local.in: tokens are alternatives (a message sits in one folder), unlike t:/cc: which narrow.label: and flag: are the explorer's own filters, written down. Clicking a label or a flag in the sidebar puts the token in the box, and typing the token lights the sidebar row — so a filtered view can be read, edited and kept in the recent-search list like any other query. Type the colon and the list of labels (or flags) drops down; names with spaces are quoted for you, and a sublabel goes in as label:"Parent/Child". There is one of each, so a second label: token replaces the first.Example: f:alice s:budget df:2026-07-01 finds messages from Alice about the budget received since 1 July.
Quote a value to search for a phrase — the words must sit side by side, in that order: b:"send amendment" leaves out mail that merely mentions “send” somewhere and “amendment” somewhere else.
Add ~N after the closing quote to loosen that into a proximity search: the words within N words of each other, in either order.
b:"send amendment"~5 — the two words within five words of each otherb:"send amendment"~0 — side by side, either way roundb:"send amendment"~ — a bare tilde means 10Proximity sits exactly between the two things you can already ask for: b:send b:amendment finds them anywhere in the same message, b:"send amendment" finds only the exact phrase, and ~N finds them in the same sentence without insisting on the wording. It works on f:, s:, b: and bare words — the fields the full-text index covers. t:, cc: and a: are matched a different way and have no notion of distance, so a tilde there stays part of the text you typed.
Terms in a query are combined with AND by default — every term must match. You can also write AND explicitly. An uppercase OR (or |) splits the query into alternatives and shows messages matching any side; AND binds tighter than OR.
f:alice s:invoice — from Alice and subject contains “invoice”f:bob OR f:carol — from Bob or from Carolf:alice s:invoice OR f:bob — (from Alice and subject “invoice”) or (from Bob)Lowercase or is treated as an ordinary search word, and any df:/dt: date range applies to every alternative. A date-format picker in the search box controls how dates display in results, so the format matches how you read.
You can also type a plain question. MailCode recognises what you are after, runs the search it implies, and reads the answer out of the mail it finds — with regular expressions, on this device, sending nothing anywhere.
| Ask for | It finds |
|---|---|
phone numbers — find phone number of Alice Chen | Numbers qualified by an international prefix, a label in front of them (Tel:, GSM:, cep:), or a grouped 10-digit shape. The same number written three ways is collapsed into one, keeping the spelling that carries the country code. |
email addresses — what is the email address of the supplier | Addresses in the body and subject, lower-cased and de-duplicated. |
IBANs / account numbers — iban of Acme Ltd | Only IBANs that pass the ISO 7064 check-digit test, so near-misses do not make the list. |
links — links about the RFC-014 rollout | http(s) URLs, trailing punctuation trimmed. |
the mail itself — find mails related with RFC-014 | Nothing is read out; the list below is the answer, and the panel accounts for the search that produced it. |
Questions work in English and Turkish (Alice Chen'in telefon numarası, RFC-014 ile ilgili mailler).
A panel above the list shows:
Read 214 message(s)), and when that was not all of it. Up to 500 matched messages are read, newest first.If a message is findable by subject but not by its text, its body reached the index late. Settings → Sync → Search index → 🔍 Check counts the index, breaks it down per account and folder, and verifies it is not corrupt; ⟳ Rebuild repairs it. Nothing is deleted or re-downloaded — see When something looks wrong.
MailCode keeps mail on this device in two different senses, and the difference matters:
Both Exchange and IMAP accounts store mail locally, and full-text search covers all of it. The All sources chip beside the search box (or src:) is how you tell the two apart in results.
Settings → Sync → Keep mail locally chooses the window: 1 month, 3 months, 6 months, 1 year, or Everything. Per-account overrides live on the account card.
The window shapes the list as well as the download:
Under the setting, a coverage readout says how far back each account has actually reached — and names the shallowest folder when one folder is capping the guarantee, so “back to 16 Jul” next to a window of Everything reads as the fact it is rather than a contradiction.
Settings → Storage → Archive database reports the database size and offers:
| Tool | What it does |
|---|---|
| Compact DB | Reclaims free space left behind by deleted archive data. |
| Dedup imports | Removes duplicate imported messages — same sender, subject and minute. |
| Find duplicates (everything) | Compares imports, synced mail and local-only mail against each other, across every account and the Local Archive. Two copies match on their Message-ID, or on sender + subject + a timestamp close enough to be the same message. Nothing is selected for removal until you choose. |
The preview lists each group with every copy's folder, account and date. Search it — by subject, sender, folder or date — to work through a long list a few groups at a time; the folder checkboxes narrow it further, and Keep oldest / Select all shown apply to what the filter leaves. Copies selected under an earlier filter stay selected, and the dialog says so above the Remove button rather than deleting them quietly.
Every copy a scan finds is then badged ⧉ in the message list and in the open message, so the duplicates stay visible while you work instead of only inside the dialog. The badge says how many copies the archive holds; Settings → Storage → Duplicate marks clears them, and removing copies updates them.
Settings → Sync carries the repair tools — ⇄ Settle now, the search-index check and rebuild, attachment backfill, and the reply-chain backfill that redraws old conversations as trees. All of them are described in When something looks wrong.
Settings → Storage → Open storage panel… shows how full your mailbox is, which folders are largest, and turns that into one deliberate action. It has three parts.
Mailbox usage. A bar with used-of-capacity and a percentage, refreshed on demand. If your server does not report a quota, type the capacity in by hand. Set the percentage at which MailCode should warn you; when it does, the panel offers Remind me tomorrow.
⇄ Compare — server vs this device. Compares the folders you tick message by message, not by count, because a difference is only useful once you know what it is made of. It reports what is on the server but missing here, what is here but archived off the server, and what is unrecorded. One request per 200 messages, so a large folder takes a moment. 💾 Mark local-only stamps a folder's mail as no longer on the server, for mail that was cleaned by something other than MailCode.
Move Old Mail → takes everything received before the date you pick, in the folders you tick, and does the whole job in order: copy into the local archive, remove from the server, file under the local folder you name (an existing one, or + new folder…). Only messages verified present in the local archive are ever removed from the server; anything that could not be archived stays where it is, so mail is never left half-moved. Attachments and inline images are downloaded before the server copy goes, so moved mail still renders offline. You see the plan first, then a second confirmation carrying the real per-folder counts. Newer mail is never touched. Tick copy only to leave everything on the server.
Choose how the server copy goes: recoverable delete (the default) or permanent delete, which frees space immediately.
Deleting mail in MailCode does not go straight to nothing. Recently Deleted in the explorer holds what can still be brought back, in two sections — because they recover two different things and only one of them is always there.
🖴 On this device. MailCode's own copy of what it deleted, taken before the delete is sent anywhere, with the body and the attachment bytes — which is what makes a restore the message rather than a stub. Restoring is local: no credentials, no network. It works with the mailbox offline, with the account removed, and after the server's own retention has expired, and it is the only recovery an IMAP account has.
☁ On the server. Exchange's Recoverable Items — the same place Outlook's Recover Deleted Items From Server reads. This is the only one that can put a message back into the mailbox; restoring from the device puts back the copy, not the mail. Exchange accounts only, so the row is absent on IMAP rather than sitting there permanently empty. EWS
Messages here are listed one row per message, never grouped into conversations — what survives a delete is whatever each individual delete left behind, so a thread is rarely whole, and collapsing them would hide which messages can actually come back. The toolbar carries only what means something over deleted mail: group by date, sender or subject, sentence rows, and three actions.
| Action | What it does |
|---|---|
| ↩ Restore | Puts the selected messages back — into the local archive, or into the mailbox from the server section. With nothing selected it restores everything listed. |
| ✕ Purge | Destroys the selected messages. This is the last copy. |
| Empty | Clears the whole device bin at once. |
The device bin keeps mail for 30 days, and is capped at 2 GB — the cap is the one that usually bites, since binned mail carries its attachments and one afternoon spent clearing a mailbox is inside any retention window. Whichever comes first, the oldest goes.
Bring existing mail into the archive from the File menu:
.pst (or .ost) files, including attachments, and index them. Queue several files (Add files… allows multi-select) and they are imported one after another under a single job, with a Stop button; everything de-duplicates against what you already have, so overlapping files and re-runs are safe..eml files to index them into the archive.The folders come with the mail. Keep the PST’s folder structure files each message the way Outlook showed it — Sent Items, Calendar, Sync Issues › Conflicts become folders under the archive folder you named, drawn as a tree whose parent rows count what is beneath them. The same tick on Index EML Files… (Keep the folder structure on disk) turns every directory under the one you picked into a folder, nested the same way, so a PST that was exported to disk gets its Sent Items and Calendar back instead of pouring 900 messages into one folder; maildir’s cur and new are folded into their parent. Untick either to pour everything into the single folder above, as older imports did. An import that already went in flat does not have to be read again — right-click its folder in the Local Archive and choose Re-file into the PST’s folder structure…, which moves the rows and renames the files without re-reading a message or recopying an attachment.
Choosing where it lands, and seeing it before it runs. Index into archive folder is a list of the folders the Local Archive already holds as well as a place to name a new one — pick an existing folder and the import merges into it rather than building a second one beside it. With Import PST… the panel then reads the file's folder tree and lists every folder the import would write into, how many messages each would take, and whether it already exists: a folder that does, and its subfolders, are merged into; the rest are created. Nothing is duplicated either way — a message already in the archive is skipped.
A PST does not always have folders to mirror. Mail that sits at the root of the data file — Outlook shows it loose, under no folder at all — has nothing to be filed under, so it goes straight into the folder you chose and the list says root of the file beside it. Two exports of the same year can therefore look different: one with an Inbox lands under 2021 › Inbox, one without lands in 2021 itself, alongside it. To put both in the same place, pick the subfolder (2021 › Inbox) as the destination for the file that has no folders of its own.
Either job reports the same way: a card in the sidebar under Local Archive, a bar in the panel it was started from, and a line in the status bar — all reading items scanned / items found · new imported, with what happened to the rest named beside it (already archived, duplicate, unreadable). The count they climb to is everything the source holds, not a target the folder has to reach, so a re-run that scans 8,000 files and imports none is the expected result and says so. While either is running, Esc is held: it will not close the panel or clear the mailbox behind it, and mailbox shortcuts (new message, move, delete) do not reach past it. ✕ and Close still put the panel away, and the import carries on without it.
archive.db — a large PST can grow it to hundreds of gigabytes. The chosen folder must stay connected for that mail to be readable.Imported mail lands in its own account so it never mixes with a live mailbox, arrives unread, and can be de-duplicated afterwards from Settings → Storage. Search reaches it like everything else — src:import narrows to it, and ⑂ Imported under Reply chains reads the reply headers out of the files on disk so old conversations draw as trees rather than one flat thread.
.eml files inside MailCode’s own storage rather than a folder you choose. macOS lets a sandboxed app read a folder you picked only until it quits, and MailCode keeps no standing claim on one — mail indexed where it sits would open on the day it was imported and have no body after the next restart. Everything else about importing is the same.The other direction: mail whose body sits inside the database can be written out to .eml files on disk, one per message. Right-click a folder → Export … stored to .eml files… (in the Local Archive tree), or Export local copies to .eml files… on a mailbox folder. Select messages in the list and right-click → Move N to .eml files on disk… to export just those — which is the difference from Save N as EML in the same menu: that writes copies and changes nothing, this hands the messages' storage over to the files.
Only part of a folder. messages received takes an optional date at each end — leave both empty for everything. Exporting mail older than a date is the usual case: the old years go to disk and the recent months keep their copy in the database. For a live folder the same dates decide how far back the mailbox is asked to go, so “everything before 2024” fetches and writes exactly that.
Each message becomes a file named the way an exported PST names them — DDMMYYYY_Subject.eml — in a directory tree that mirrors the archive's own folders, so the export can be handed straight back to Index EML Files… on another computer. A folder past 4,000 messages is split into a directory per year, which is what keeps it openable in Finder or Explorer.
What the archive keeps is the index: the message stays exactly where it was in the list, in search and under its labels, and is read back from its file when you open it. What leaves is the copy in archive.db — bodies and attachments both, which is where an archive's size actually comes from. The dialog says how many messages it will write and roughly how much comes back before you start.
Click any conversation in the list to open it in the reading pane. Related messages are grouped into a single thread; click a row inside the thread to expand and read that message.
@ icon marks messages where you were directly mentioned. How unread mail stands out — bold, tinted text, tinted row — is yours to set under Settings → Appearance → Read / Unread..eml / .msg items) open in their own preview window. Every previewer ships inside the app, so a Word document or a spreadsheet opens with the network off.ru → en — and offers Show Original, Copy and Save as Note; the toolbar button toggles the same way. A word emphasised in the middle of a sentence loses its bold while the translation is showing, and a line with a link in it is translated piece by piece so the link keeps its label — both come back untouched with Show Original..docx / .xlsx, named for the language it is in — (EN), (TR) — while ⬇ Download still saves the original untouched. ⊞ Show Original puts the original back at any time, and neither the file on the server nor the message is ever modified. A sentence Word had split across several pieces of formatting is translated as one sentence and lands in the first of them, so a word emphasised mid-sentence loses its emphasis in the translated copy; links keep their labels. A very long document is translated as far as 120,000 characters and says so, leaving the remainder in its own language.undisclosed-recipients:; header, so a blank line no longer reads as missing information. MailCode will also send a message on Cc alone.The control above the message list changes how the list is built and what it shows:
@).Reply arcs. Grouped by Subject, a group is one conversation, and hovering any message in it draws a curve down the connector column to the message it answers and out to the messages that answered it — the same links the conversation timeline draws in the reading pane. A message whose mail carries no reply headers draws nothing rather than appearing to stand alone, and a link whose other end is collapsed or scrolled out is not drawn at all.
Start a new message with the + New Message button (top-right) or Ctrl+N. The composer opens as a floating new-message.mail panel — recipients are the // to, // subject, // cc, and // bcc header lines, and your message goes in the editor below.
Replies and forwards can open inside the reading pane instead, with the message you are answering still readable below the editor — drag the divider to share the space. Toggle that under Settings → Appearance → Compose. Either way, double-click the composer's title bar to fill the window, and drag its edges to resize.
The toolbar covers bold, italic, underline, strikethrough, bullet and numbered lists, indent, text alignment, headings, font size in pixels, text colour and highlight, row and paragraph spacing, the format painter, tables (with borders, column resizing, and a table context menu), and clear-formatting. You can paste images and Excel tables straight into the body and resize them, and the composer's font is the font your recipient sees — set its default size under Settings → Appearance → Compose.
.eml.As you type, misspelled words are underlined and correction suggestions appear — right-click a flagged word to pick a replacement. MailCode paints its own underlines rather than the system's, so the language it checks against is the one you chose, not the one the OS guessed. Pick one or more languages (English, Turkish, German, Spanish, French, Russian) and the underline style under Settings → Appearance → Compose.
The cursor in the message body is drawn terminal style: a block sitting on the character it is about to overwrite, blinking on a steady beat and going solid the moment it moves. It works the same inside a quoted message. Settings → Appearance → Compose → Cursor switches it to an underscore, or back to the thin line the system draws.
Select text in the reading pane before you hit Reply or Forward and MailCode asks what to quote: only the selected text, or the whole message. Pictures inside the selection come with it — an inline image quotes as the image, not as a placeholder — and the excerpt keeps the sender's own formatting rather than MailCode's reading style.
The same dialog carries a checkbox for the original message header — the From / Date / Subject / To / Cc block that normally sits above the quote. Clear it and the quote ships on its own. Your last choice becomes the default for the next message.
For a reply where nothing was selected, the same switch sits on the quote bar in the composer, next to as sent / reading view: click header / no header to include or drop that block. While it is off, the // re: lines above the quote are faded — they are MailCode's own note of what you are answering and are never sent.
Replying inside the quoted message is a first-class habit here: Settings → Appearance → Inline reply comments marks whatever you write inside the quote with your own colour, initials, and weight, so the recipient can tell your words from theirs.
| Action | How |
|---|---|
| New message | + New Message or Ctrl+N |
| Reply / Reply All | Ctrl+R / Ctrl+Shift+R |
| Forward | Ctrl+Shift+F |
| Attach a file | Attach in the composer toolbar, or paste it |
| Insert signature | Pick from the signature dropdown (manage them under Settings → Signatures) |
| Send | Ctrl+Enter or Send → |
| Save draft | Ctrl+S |
| Save as EML | Ctrl+Shift+S, or File → Save as EML… |
| Ctrl+P, the printer button in the reading pane, or right-click → Print… — opens a preview where you can pick a page range before printing. Highlight text in the message first and the preview opens on that selection, with Whole message one click away | |
| Cycle windows | Ctrl+Tab (add Shift to reverse) |
When you configure an AI provider under Settings → AI Assistant, the composer gains an AI button and right-click actions that operate on your selection or the whole body: Proofread, Rewrite, Shorten, Expand, and a custom instruction. The same panel carries a Translate control — pick the language to translate into (the language you wrote in is detected for you), then translate the selection or the whole draft. Tick Bilingual to keep what you wrote and put the whole translation below it, in a colour of your choosing, which is how you write to someone who reads both. Bilingual has two layouts: stacked, the whole translation below what you wrote, and side by side, the two languages in two columns that stay level with each other paragraph by paragraph — built as a table rather than as columns, which is what survives in the reader’s own mail program. The layout is remembered along with the language and the colour. Translation works even with no provider key: short texts go through the free service, and only longer ones need the AI. MailCode can also summarise long threads — including key points with a timeline and the actions left at the end — and translate messages; those results are saved to Notes for later reference.
Any AI edit can be taken back. Applying a result replaces the draft’s body, which used to leave Ctrl+Z with nothing to undo. Now a bar appears naming what was applied — Proofread, Rewrite, Translate — and stays until you use it; Ctrl/Cmd+Z (or Edit ▸ Undo) puts the draft back exactly as it was. Once you have typed on top of the result, undo belongs to your own keystrokes again. A draft parked in the dock keeps its undo.
Ask AI on the search panel is the other entry point: after a question has been answered from your own mail, it hands the newest matched messages to the provider for an answer in prose. The regex-based answer costs nothing and needs no key; the AI step is always the second one, never a prerequisite.
Click Later (the ⏰ button) in the composer to schedule delivery for a future time. Scheduled messages wait in the local Outbox and are sent at the chosen moment. Works for both Exchange and IMAP.
Your mailbox folders appear in the explorer under each account, and the Go menu jumps straight to Inbox, Sent, Drafts, Archive, or All Mail.
A move that is still in flight shows in the status bar and leaves a placeholder row behind, so a slow server never makes a message look lost — and a second attempt on the same message is refused rather than duplicated.
Flags let you triage mail by urgency. Open the Flags view from the activity bar to see every flagged message laid out as an Eisenhower board.
| Flag | Meaning |
|---|---|
| Important & Urgent | Do first — highest priority |
| Important, Not Urgent | Schedule — near-term follow-up |
| Urgent, Not Important | Delegate — hand off |
| Neither | Eliminate — low priority |
| Follow | Track replies on this thread |
| Read Again | Revisit when you have time |
| Monitor | Watch progress — this flag is customisable (rename, remove, or restore it) |
Flag a message from its toolbar, its row, or the right-click menu; drag a flag from one message onto another to move it. Flags can carry a due date, and a reminder fires when it arrives — per-message alerts are set with the 🔔 button, and a badge in the title bar counts what is due.
The Flags page has four views:
| View | Shows |
|---|---|
| Board | The Eisenhower 2×2 plus the Follow, Monitor, and Read Again lanes |
| List | Every flagged message as one flat, sortable list |
| Label | Flagged mail grouped by label |
| Gantt | Flagged mail on a timeline, by due date |
Labels are colour-coded tags you can apply to any message. Add one with + Add label in the explorer, or right-click a message. Click a label to filter the list to everything tagged with it; each label shows how many messages carry it.
Under Settings → Rules & Auto-Reply you can create rules that act on incoming mail automatically — and set an auto-reply message for when you are away, optionally limited to one reply per sender and to a date range.
A rule matches on the sender address, sender name, subject, body text, importance, or the message date (on or after / on or before / between two dates, or a rolling window such as “in the last 7 days”), combined with any (OR) or all (AND). Matching rules can apply a label, set a flag, mark as read, move to a folder, forward to an address, or show the message in the focus area.
The focus area. A rule whose action is Show in Focus area pins whatever it matches to a strip at the top of the message list, above the column headers — so the mail you are waiting on is the first thing you see in whichever folder you open. It is the one action that changes nothing about the message: nothing is moved, marked or labelled, and the mail stays in the list where it belongs. The strip only says which to read first. It matches message by message, not conversation by conversation: a rule for one sender pins that person's mail, not every thread they have ever written into — the rest of each conversation stays in the list below, where it was.
The area is drawn from the folder on screen, so it follows the search box and the filter chips along with the rest of the list, and its header counts what matched. It holds ten conversations before it scrolls inside itself, and clicking its header folds it away to a single line until you want it back. Because it is an instruction to this list rather than to the mailbox, a focus rule is never saved on the mail server, and there is nothing to apply to mail already there — open the folder and it is pinned.
Body text is matched against the message preview until MailCode has downloaded the full body, so a body rule may fire on a later pass rather than the instant the mail lands. Forwarding runs on new messages only, once per conversation — ticking Apply to messages already in the mailbox never mails out old threads.
Mail you have moved yourself is left alone: a message you filed by hand is never re-filed by a rule.
Rules belong to one account. Each account has its own rules and its own away message, and they only ever run on that account's mail. When you have more than one account, a Rules for picker at the top of the tab chooses which account you are editing — so you can write a rule for a mailbox without switching to it first. Two things still need that account to be the one open in MailCode: saving a rule on the mail server, and running a rule over mail already in the mailbox. Save the rule anyway and MailCode puts it on the server the next time you switch to that account.
Auto-reply follows the same picker. Each account answers with its own message, from its own address, and keeps its own record of who it has already replied to. Replies go out while that account is the one open in MailCode.
The Notes view collects the by-products of the AI assistant — saved translations, summaries, and action-item extractions — each linked back to the message it came from, so you can find that analysis again later without re-running it. Saving reports a clear “Saved” status so you know it landed.
Open Contacts from the activity bar. People you exchange mail with are harvested into your contact list automatically, sorted alphabetically with quick search. Harvesting can be turned off per account, and harvested contacts can be deleted in bulk (tick the rows, then Delete).
Contacts feed the composer's recipient autocomplete and the f: / t: / cc: suggestions in search.
The Calendar view shows a month grid with today highlighted and upcoming events listed in the explorer. Create events with + New, or forward an email as a meeting from the reading pane.
Meeting invitations arriving in your inbox carry a response bar: Accept, Tentative, Decline, or Propose New Time. The meeting detail shows the organiser, the invitee list with each person's response, the purpose, and a link back to the invitation mail.
MailCode registers as a viewer for .eml (RFC 822) and .msg (Outlook) message files. Double-click one in Finder or Explorer and it opens in a read-only preview window — no account required.
It also registers as your default mail client, so other applications can hand it a document:
mailto: links open a composer with the address filled in.Open Settings from the bottom of the activity bar. It is organised into tabs.
| Tab | What you control |
|---|---|
| Accounts | Connected accounts; per-account default, offline, contact harvesting, attachment mode, keep-locally window, and a browser for that account's local folders. |
| Sync | Start at login, attachment downloads, how much mail is kept locally (with the coverage readout), Exchange-category syncing, how much of an IMAP folder loads on open, diagnostic logging, Exchange connection reuse, and the search-index, reply-chain and local-archive repair tools. |
| Storage | Mailbox usage, the storage panel (compare and move old mail), archive database size, compaction, and duplicate-finding. |
| Appearance | Theme (Dark+ / Light+), accent colour, interface zoom per region, email font, line height, list row height, row flag colour, search highlight colour, conversation timeline, compose defaults and font size, spell-check languages, read/unread behaviour and styling, and inline reply comments. |
| Shortcuts | View and rebind every keyboard shortcut, and add your own from a list of commands. |
| Signatures | Create and edit signatures, including images. |
| Rules & Auto-Reply | Automatic labelling / filing rules and away messages, per account. |
| AI Assistant | Configure your AI provider, endpoint, model, key, and translation limit. |
| Microsoft Account | Microsoft 365 OAuth sign-in (with optional Entra client and tenant IDs). |
| Integrations | Third-party connections — Squadus, Skype for Business, and others. |
| About | Version, the user manual, What's New, Report a Problem, and Check for updates automatically (a quiet once-a-day check on first open). |
MailCode ships with matched Dark+ and Light+ themes; switch anytime in Appearance. Email bodies always render on a clean white background for legibility while preserving the sender's own colours, bold, italics, and underlines.
Both themes remember the same accent colour, and it follows the theme rather than being written straight through: the hue you picked is kept, and its lightness is walked toward the readable side of whichever background you are on until it clears the contrast bar for text. An accent that already read stays exactly as it was — this only rescues one that would otherwise have gone near-black in Light+ or disappeared into white in Dark+, taking the folder names, unread markers and selection with it.
| Shortcut | Action |
|---|---|
| Ctrl+N | New message |
| Ctrl+R | Reply |
| Ctrl+Shift+R | Reply All |
| Ctrl+Shift+F | Forward |
| Ctrl+Enter | Send |
| Ctrl+S | Save draft |
| Ctrl+Shift+S | Save as EML |
| Ctrl+P | |
| Ctrl+D | Delete |
| Ctrl+M | Move to folder |
| Ctrl+Q | Mark as read |
| Ctrl+Tab | Cycle windows (Shift reverses) |
| Ctrl+1 | Mail view |
| Ctrl+= / Ctrl+- / Ctrl+0 | Zoom in / out / reset |
Beyond the bindings: arrow keys move through the list and, after a click into the sidebar, through the whole explorer tree (Enter opens); Esc clears the current filter; Shift-click and Ctrl/⌘-click build a multi-selection.
The table above is the fixed list, but it is not the limit. Under Settings → Shortcuts → Your shortcuts, choose a command from the drop-down — printing, saving as EML, going to a folder, switching view, attaching a file to a draft, and more — then press the keys you want for it and click + Add. Each command takes one binding; click its badge to change the keys, or the ✕ to remove it.
A combination that is already spoken for is refused, naming what owns it, and your own shortcuts need Ctrl (⌘) or Alt so they cannot fire while you type. Commands that act on a message do nothing when nothing is selected, and compose commands only work inside a draft.
On macOS use ⌘ in place of Ctrl. All shortcuts can be changed in Settings → Shortcuts.
Everything here lives in Settings → Sync, and none of it deletes mail.
| Tool | Use it when |
|---|---|
| 🛟 Report a Problem | Anything at all. Sends a short report by email from your own account — what happened, the app version, and recent error details. No message content or passwords are included. It is also on the Help menu. |
| 💥 Crash dump (in the same report) | MailCode vanished without a trace. A crash runs no code inside the app, so nothing in it can record its own death — two things outside it do. A minidump is written by a handler process that outlives MailCode, and a session sentinel, refreshed while the app lives and removed only on a real quit, proves a session never reached its exit and says to within a minute when it stopped. Together they separate a crash (dump) from being killed outright by a task manager, a security agent or a power cut (no dump). Report a Problem lists what it found and, when there is a dump, offers 💥 Attach crash dump — offered, never taken: a dump is a copy of the app's memory and can hold message text, so nothing is attached until you press it, and it travels compressed. |
| Diagnostic logging | You have been asked for a log. Records sync, send, and connection failures plus a settings snapshot — never passwords or message content — to diagnostic.log; 📂 Reveal log shows you the file. |
| 🔍 Check / ⟳ Rebuild search index | Search finds a message by subject but not by its text. Check counts the index, breaks it down per account and folder, and verifies it is not corrupt; Rebuild repairs it. The window will not respond while it rebuilds, and nothing is deleted or re-downloaded. |
| ⑂ Reply chains — Imported / From Exchange | A conversation draws as one flat thread instead of a tree. Imported reads the reply headers out of the .eml files already on disk, with no network. From Exchange asks your mailbox for the mail that has no file to read — headers only, no bodies or attachments. Both run in the background and can be stopped. |
| ⇄ Settle now | Mail appears under Local Archive that the server still has. Asks the server about every folder and moves those copies back; anything the server no longer holds stays put. |
| ⬇ Fetch missing / ↺ Retry failed | Old messages are missing their attachments. Force retry all appears for attachments that have already failed three times. |
| Reuse Exchange connections | Syncing misbehaves on an unusual Exchange setup — turn it off. It is on by default because NTLM re-authentication otherwise dominates every call; MailCode also detects servers that re-authenticate regardless and turns reuse off by itself. |
IMAP accounts connect to any standard server but cannot use Exchange-specific APIs. This table shows what each account type supports.
| Feature | Exchange (EWS) | IMAP |
|---|---|---|
| Read, compose, reply, forward | Yes | Yes |
| Delete, mark read/unread | Yes | Yes |
| Move to folder (Ctrl+M) | Yes | Yes |
| Save draft to server | Yes | Yes |
| Labels & sublabels | Yes (synced as categories) | Yes (local) |
| Flags & priority board | Yes | Yes |
| Send Later | Yes | Yes (via SMTP) |
| Contacts (auto-harvested) | Yes | Yes |
| AI assistant & Notes | Yes | Yes |
| Local archive & full-text search | Yes | Yes |
| Ask-a-question search | Yes | Yes |
| PST / EML import | Yes | Yes |
| Calendar & meeting invites | Yes | No |
| Global Address List (GAL) | Yes | No |
| Message Recall | Yes | No |
| Server-side inbox rules | Yes | No (rules run locally) |
| Empty Deleted Items | Yes | No |
| Mailbox quota, compare & move old mail | Yes | No |