Released July 15, 2026 — downloads for this release
Two options are available for v0.8.32:
| Download | When to use |
|---|---|
QuickMail-0.8.32-win.msi — Windows
installer |
Recommended for most users. A standard setup wizard with license agreement; installs per-user with no elevation required, adds the WebView2 Runtime if missing, and enables automatic updates. |
QuickMail.exe — standalone portable
executable |
No installation required. Copy it anywhere and run. |
Both downloads include the .NET 8 runtime — you do not need to install .NET separately.
This release adds contact sync, which pulls the contacts and prior recipients from your Microsoft and Google accounts into QuickMail’s address book, and makes creating folders easy to reach from the keyboard. It also restores personal Microsoft (Outlook.com / Hotmail) sign-in, which had stopped working, and fixes replies to HTML-only messages coming through with an empty quote. If you installed QuickMail from the MSI, this update is delivered automatically. Everything from v0.8.31 — single-instance launch, plain-text reading, Windows notifications for new mail, and running in the background when you close the window — is included.
QuickMail can now fill its address book from the contacts and prior recipients already stored in your Microsoft and Google accounts. Turn it on per account and the people you correspond with become available for autocomplete when you address a message — no more typing full addresses for people your account already knows.
Creating a folder used to be available only from the folder tree’s right-click / Shift+F10 menu, which made it hard to discover from the keyboard. It now has proper, discoverable entry points:
Signing in with a personal Microsoft account had begun failing outright with a “scope … is not valid” error, which blocked adding or re-authorizing Outlook.com, Hotmail, and Live.com accounts on shipped builds. QuickMail now requests the correct, explicit mail permissions for these accounts. Personal and work Microsoft accounts both sign in normally again.
Reply and Reply All to a message that had no plain-text part produced a reply containing only the “On … wrote:” attribution line, with none of the original message quoted beneath it. Replies now fall back to the message’s HTML content when there is no plain-text part, so the original text is always quoted — matching how Forward already worked.
If you had opened a message in its own window and then closed the main window, that stray message window could keep QuickMail running invisibly in the background, which in turn stopped you from launching a fresh copy. Message windows are now closed together with the main window, so relaunching always works.
Thank you, as always, to everyone who contributes to QuickMail through code, bug reports, feature suggestions, and other feedback — including the reports that pinned down the broken personal-Microsoft sign-in, the empty HTML-only reply, the K-in-the-folder-tree flag, and the launch problem caused by a lingering message window.
/me/contacts + /me/people)
and Google (People connections +
otherContacts) accounts into the existing local address
book, deduplicated by email against local contacts and surfaced through
the existing compose autocomplete with no compose-side changes. Off by
default, per-account SyncContacts toggle (OAuth accounts
only). Enabling requests read-only contact scopes (one-time consent) and
pulls an initial snapshot; disabling purges that account’s synced
contacts. Re-sync updates in place by provider id, removes
server-deleted rows, and never touches local or other accounts’ rows.
Prior recipients capped at 1000 per source (logged when capped).ContactSource provenance on
ContactModel (back-compatible with old
contacts.json), IContactSyncService /
ContactSyncService, provider sources
(GraphContactSource, GoogleContactSource +
GooglePeopleClient), scope-aware GraphClient
overload, and RequestContactsConsentAsync across the OAuth
services. Read-only only: no write-back, no iCloud/CardDAV (deferred to
v2). Spec:
docs/planning/contact-sync-server-issue-256-pm-dev-spec.md.Seed()-ed); added the Add
Account opt-in checkbox (SyncContacts moved to the shared
editor base); added the address-book Account column
with concise composed accessible names and the
ContactListShowFieldLabels opt-in (off by default); made
the Account Manager toggle apply immediately from the checkbox
Click handler (async fire-and-forget stays in the View per
the MVVM rules) rather than on Save; dropped the chatty per-row “synced,
read-only” focus hint.IOAuthService.GetAccessTokenSilentAsync + a
silentOnly path through GraphClient.
Background sync throttled to 12h via SyncAllDueAsync; the
manual “Sync Contacts Now” command bypasses the throttle.ContactServiceSyncTests,
ContactSyncServiceTests,
ContactSourceMappingTests,
ContactRefinementsTests,
ContactSyncScopeAndViewModelTests, and
OAuthServiceScopeSelectionTests..default migration (#217/#218/#234) was
over-applied to the IMAP/SMTP path. .default on
outlook.office.com is invalid for personal Microsoft
accounts (no admin-consent model; the resource isn’t in Required
Resource Access for consumer sign-in), so personal-account sign-in via
IMAP failed with “scope … is not valid”. Because the Graph backend is
feature-gated, IMAP is the only Microsoft path in shipped builds, so
this broke consumer sign-in for everyone. ImapSmtpScopes
now requests explicit IMAP.AccessAsUser.All +
SMTP.Send, which work for personal and work accounts alike.
Tests lock the explicit IMAP scopes; ENTRA doc + spec corrected.detail.PlainTextBody, so
replying to a message with no plain-text part produced just the
attribution line. Applied the same HTML→text fallback
CreateForward already uses. Preserving HTML formatting in
replies is tracked as a follow-up in #262.folder.new command (Command Palette + customizable hotkey)
and a Folder → New Folder… menu item; context menu and
the new entry points share one CreateFolderUnderNodeAsync
helper. Added a New Folder button to the move/copy
folder picker (tree-view picker only) that creates under the selected
node — or the account root — and rebuilds the picker tree in place.
Re-entrancy safety: folder creation inside the picker refreshes only the
folder cache, deferring the main-window tree rebuild
(_folderTreeRebuildPending →
CommitPendingFolderTreeRebuild, flushed at the call site
after every picker close, including cancel) to avoid the documented
“re-query the folder tree while the dialog’s loop is active” crash.
Removed the picker button’s _New mnemonic (it fired on the
type-ahead n), wired Alt+N explicitly, and
set TextSearch.TextPath="Label" for folder type-ahead._openMessageWindows and closed in
MainWindow.OnClosed, the same way compose windows are. An
orphaned message window had been keeping the process (and the
per-profile single-instance mutex) alive after the main window closed,
blocking relaunch.IsMessageAreaFocused() so it
fires only when the message list or a group tree has focus; elsewhere
the command is unavailable, e.Handled stays false, and the
folder tree’s type-ahead handles K.