Years of mail, on your own disk.

MailCode User Guide

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

MailCode main window in light theme
Figure 1. The MailCode workspace — activity bar, explorer, message list, and reading pane (Light+ theme shown).

What is MailCode

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:

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.

Try it first. Launch MailCode before adding any account and it opens in Demo mode — a fully populated sample inbox with no network access. Every screenshot in this guide was taken in Demo mode, so you can follow along safely.

The workspace

The window is divided into four regions, left to right:

RegionWhat it does
Activity barThe 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).
ExplorerAccounts, folders, labels, and flag groups — the collapsible tree that scopes what the list shows.
Message listThe current folder or view, grouped by conversation (or by date). Unread rows are brighter; a blue dot marks unread threads.
Reading paneThe 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 explorer tree

The tree is ordered so the things you open most sit highest:

  1. Favorites — any folder you pin (right-click → Add to Favorites), from any account.
  2. All Mail — every connected account merged into one list, each row badged with the account it came from.
  3. Accounts — one row per connected account; expand it to reach that account's folders. Rows can be reordered, and expanded or collapsed from the right-click menu.
  4. Folders — the active account's folder tree. Special folders (Inbox, Sent, Drafts, Trash, Junk) sit at the top with icons; custom folders follow. Unread counts show as badges.
  5. Local ArchiveAll local mail: everything held on this device that the server no longer has (see The local archive).
  6. Recently Deleted — mail this app can still bring back, in two sections (see Recently Deleted). It sits next to Local Archive because they answer the same question: where did that message go?
  7. Labels and Flags — click either to filter the list.

Click into the sidebar and the arrow keys walk the whole tree; Enter opens the highlighted row.

Selecting more than one message

The list is built for acting on many messages at once:

Tabs

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.

Windows and panels

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.

Adding an account

Open Settings → Accounts → Add Account (or the Accounts icon at the bottom of the activity bar). MailCode supports three sign-in paths.

Microsoft Exchange (EWS) EWS

  1. Choose the Exchange tab.
  2. Enter your EWS URL (for example https://mail.company.com/EWS/Exchange.asmx), username, and password.
  3. Click Connect. Your folder tree loads in the explorer within a few seconds.

IMAP / SMTP IMAP

  1. Choose the IMAP tab. Common providers (Gmail, iCloud, Fastmail, Yandex…) auto-fill their server settings.
  2. Enter the IMAP host and port (usually 993), the SMTP host and port (usually 587), your email address, username, and password.
  3. Click Connect.

Microsoft 365 (OAuth)

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.

Per-account settings

Each account card in Settings → Accounts carries its own switches, so one mailbox can behave differently from another:

ControlWhat it does
★ DefaultThis account opens on launch.
✈ Go OfflinePauses syncing for this account — you keep browsing its local mail, nothing is fetched or sent from it.
⊘ Harvest OffStops adding addresses from this account's mail to Contacts.
AttachmentsPer-account override of the global Attachment downloads setting.
Keep locallyPer-account override of the global Keep mail locally window.
🗂 BrowseLists this account's locally stored folders and message counts; click one to open it.
Your credentials stay on your device. Passwords and OAuth refresh tokens are encrypted with the operating system's own keystore — Keychain Services on macOS, DPAPI on Windows — and are sent nowhere except directly to your own mail server.

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.

Where the answer comes from

Three sources are searched, and the chips beside the box tell you which:

ChipWhat it does
All folders / This folderOnly 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 onlyWhich 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.

Getting a query into the box

Field prefixes

PrefixSearches
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:

Example: f:alice s:budget df:2026-07-01 finds messages from Alice about the budget received since 1 July.

Phrases and proximity

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.

Proximity 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.

Combining terms with AND / OR

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.

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.

Asking a question

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 forIt finds
phone numbers — find phone number of Alice ChenNumbers 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 supplierAddresses in the body and subject, lower-cased and de-duplicated.
IBANs / account numbers — iban of Acme LtdOnly IBANs that pass the ISO 7064 check-digit test, so near-misses do not make the list.
links — links about the RFC-014 rollouthttp(s) URLs, trailing punctuation trimmed.
the mail itself — find mails related with RFC-014Nothing 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:

Questions are answered from mail stored in the local archive, because that is where the bodies are. In a view with nothing stored behind it, the panel says so rather than spinning.

When search misses something

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.

Full-text search on IMAP. IMAP IMAP accounts keep a local archive as well, so full-text search covers their stored mail — not just what is loaded in the folder.

The local archive

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.

How much is kept

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.

Syncing

  1. Choose File → Sync Folder… (or the Archive item in the explorer).
  2. Sync downloads messages with a progress indicator; it can be paused, stopped, and resumed, and picks up where it left off — including after a restart or a dropped connection.
  3. Attachment downloads (Settings → Sync, or per account) decides when the bytes come: During sync, When opened, or Manual only.
Everything is deduplicated. Re-running a sync, an import, or a backup over mail you already have adds nothing — overlapping runs are safe by design.

Archive maintenance

Settings → Storage → Archive database reports the database size and offers:

ToolWhat it does
Compact DBReclaims free space left behind by deleted archive data.
Dedup importsRemoves 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.

Moving mail off the server EWS

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.

“Recoverable delete” does not mean Deleted Items. Exchange files those copies in Recoverable Items, a hidden area — your Deleted Items folder stays empty, which looks like nothing was kept at all. To restore one: in Outlook select the folder the mail came from, then Folder → Recover Deleted Items From Server; in Outlook on the web, Deleted Items → “Recover items deleted from this folder”. How long they stay there is your server's retention setting, and some mailboxes keep nothing — the local copy is the one this panel guarantees. Permanent delete skips that area entirely.

Recently Deleted

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.

ActionWhat it does
RestorePuts the selected messages back — into the local archive, or into the mailbox from the server section. With nothing selected it restores everything listed.
PurgeDestroys the selected messages. This is the last copy.
EmptyClears 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.

This is MailCode's bin, not your mailbox's Trash. Trash is a folder on the server, listed with your other folders; Recently Deleted is what this app can undo.

Importing mail

Bring existing mail into the archive from the File menu:

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.

Store messages as .eml files (recommended). This PST option writes each message to a folder you choose and keeps only the search index in the database. Without it, every body and attachment is copied into 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.

A mail attached to another mail is opened from a temporary copy, which the system deletes shortly afterwards. Indexing it into the archive is therefore not offered: Index into archive… in the viewer copies that message into the database instead, and says so. Otherwise the archive would hold a row pointing at a file that is already on its way out — the message would read fine until the next restart and then have no body at all.
App Store version. Imports always copy into the database, and the PST importer keeps its .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.

Exporting mail to .eml files

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.

Reading mail

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.

Reading pane with an expanded conversation
Figure 2. An expanded conversation. The thread lists every participant with their label chips; the reading pane shows the selected message and the action toolbar.

Grouping and filtering the list

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.

Message Recall EWS — for Exchange accounts, the toolbar can attempt to recall a sent message (delete unread copies from recipients on the same Exchange organisation).

Composing, replying & forwarding

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 compose window
Figure 3. The composer. Header fields read like code comments; a full rich-text toolbar sits above the body, with Attach, AI, signature, Save Draft, Later, and Send along the bottom.

Formatting

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.

Attachments

Spell checking

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 writing cursor

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.

Quoting part of a message

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.

Inline comments in quoted text

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.

Actions

ActionHow
New message+ New Message or Ctrl+N
Reply / Reply AllCtrl+R / Ctrl+Shift+R
ForwardCtrl+Shift+F
Attach a fileAttach in the composer toolbar, or paste it
Insert signaturePick from the signature dropdown (manage them under Settings → Signatures)
SendCtrl+Enter or Send →
Save draftCtrl+S
Save as EMLCtrl+Shift+S, or File → Save as EML…
PrintCtrl+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 windowsCtrl+Tab (add Shift to reverse)
Send is instant. Send closes the composer immediately and delivers in the background — you never wait on the network with a window open.
Drafts on IMAP. IMAP Ctrl+S saves to the server Drafts folder on IMAP accounts too, not only on Exchange.

The AI assistant

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.

The AI assistant is optional and off until you add your own provider key. No message content is sent to any AI service unless you explicitly trigger an AI action.

Send Later & the Outbox

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.

Start at login. Delivery happens while MailCode is running. Turn on Settings → Sync → Start at login so a restart doesn't hold a scheduled message back; the app opens hidden in the menu bar and keeps sending on time.

Folders & navigation

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 & the priority board

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.

The Flags board — an Eisenhower matrix
Figure 4. The Flags board. Four Eisenhower quadrants (Do First, Schedule, Delegate, Eliminate) plus Follow, Monitor, and Read Again lanes. Each message shows a live preview when selected.
FlagMeaning
Important & UrgentDo first — highest priority
Important, Not UrgentSchedule — near-term follow-up
Urgent, Not ImportantDelegate — hand off
NeitherEliminate — low priority
FollowTrack replies on this thread
Read AgainRevisit when you have time
MonitorWatch 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:

ViewShows
BoardThe Eisenhower 2×2 plus the Follow, Monitor, and Read Again lanes
ListEvery flagged message as one flat, sortable list
LabelFlagged mail grouped by label
GanttFlagged mail on a timeline, by due date

Labels & sublabels

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.

Rules & auto-reply

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.

Server-side rules EWS — Exchange inbox rules are read and written too, so rules that must run when MailCode is closed live on the server.

Notes

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.

Standalone notes. + New creates a note with no message behind it. Standalone notes take flags like any message, so they appear on the Flags board alongside your mail — which is how a to-do that never arrived as an email still gets triaged with everything else.

Contacts

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).

The Contacts view
Figure 5. Contacts, auto-harvested from your mail and grouped alphabetically. Click a name to see details; click their address to start a message.

Contacts feed the composer's recipient autocomplete and the f: / t: / cc: suggestions in search.

Exchange address book EWS — Exchange accounts can also reach the organisation's Global Address List (GAL) and your server-side contacts.

Calendar & meeting invitations

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.

The Calendar view
Figure 6. The month calendar. Create events with + New; upcoming events appear in the explorer on the left.
Exchange only. EWS Calendar and meeting invitations are an Exchange feature.

Opening .eml and .msg files, and sending from other apps

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:

These integrations need the packaged app installed (and selected as the default mail client in your OS settings) — they do not work from a development build.

Settings reference

Open Settings from the bottom of the activity bar. It is organised into tabs.

Settings — Appearance tab
Figure 7. Settings → Appearance: theme, accent colour, per-region zoom, email font, line height, and row density.
TabWhat you control
AccountsConnected accounts; per-account default, offline, contact harvesting, attachment mode, keep-locally window, and a browser for that account's local folders.
SyncStart 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.
StorageMailbox usage, the storage panel (compare and move old mail), archive database size, compaction, and duplicate-finding.
AppearanceTheme (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.
ShortcutsView and rebind every keyboard shortcut, and add your own from a list of commands.
SignaturesCreate and edit signatures, including images.
Rules & Auto-ReplyAutomatic labelling / filing rules and away messages, per account.
AI AssistantConfigure your AI provider, endpoint, model, key, and translation limit.
Microsoft AccountMicrosoft 365 OAuth sign-in (with optional Entra client and tenant IDs).
IntegrationsThird-party connections — Squadus, Skype for Business, and others.
AboutVersion, the user manual, What's New, Report a Problem, and Check for updates automatically (a quiet once-a-day check on first open).

Themes

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.

Keyboard shortcuts

Settings — Shortcuts tab
Figure 8. Every shortcut is listed under Settings → Shortcuts and can be rebound — click a field and press your combination.
ShortcutAction
Ctrl+NNew message
Ctrl+RReply
Ctrl+Shift+RReply All
Ctrl+Shift+FForward
Ctrl+EnterSend
Ctrl+SSave draft
Ctrl+Shift+SSave as EML
Ctrl+PPrint
Ctrl+DDelete
Ctrl+MMove to folder
Ctrl+QMark as read
Ctrl+TabCycle windows (Shift reverses)
Ctrl+1Mail view
Ctrl+= / Ctrl+- / Ctrl+0Zoom 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.

Your own shortcuts

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.

When something looks wrong

Everything here lives in Settings → Sync, and none of it deletes mail.

ToolUse it when
🛟 Report a ProblemAnything 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 loggingYou 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 indexSearch 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 ExchangeA 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 nowMail 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 failedOld messages are missing their attachments. Force retry all appears for attachments that have already failed three times.
Reuse Exchange connectionsSyncing 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.
A VPN can stall syncing. If sync hangs or Exchange times out, check whether a tunnel is routing traffic for your mail server.

Exchange vs IMAP — feature comparison

IMAP accounts connect to any standard server but cannot use Exchange-specific APIs. This table shows what each account type supports.

FeatureExchange (EWS)IMAP
Read, compose, reply, forwardYesYes
Delete, mark read/unreadYesYes
Move to folder (Ctrl+M)YesYes
Save draft to serverYesYes
Labels & sublabelsYes (synced as categories)Yes (local)
Flags & priority boardYesYes
Send LaterYesYes (via SMTP)
Contacts (auto-harvested)YesYes
AI assistant & NotesYesYes
Local archive & full-text searchYesYes
Ask-a-question searchYesYes
PST / EML importYesYes
Calendar & meeting invitesYesNo
Global Address List (GAL)YesNo
Message RecallYesNo
Server-side inbox rulesYesNo (rules run locally)
Empty Deleted ItemsYesNo
Mailbox quota, compare & move old mailYesNo

Privacy & your data

MailCode v1.10.10 · User Guide · © 2026 Ertan Yuce. Reach the developer from Help → About MailCode inside the app.
© 2026 MailCode. Made in Ankara. MailCode Releases Support Privacy Contact