Releases: kellylford/QuickMail
Release list
QuickMail v0.8.33
QuickMail v0.8.33 Release Notes
Download
Two options are available for v0.8.33:
| Download | When to use |
|---|---|
QuickMail-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 is a big release. QuickMail now has a full calendar: create your own appointments, keep repeating events, get reminders, respond to meeting invitations, and connect your Microsoft, Google, or iCloud calendar. It also makes new-mail sync more reliable, quiets down notifications after your computer wakes, and fixes opening a message in a tab. See the Calendar section of the User Guide for the full walkthrough. If you installed QuickMail from the MSI, this update is delivered automatically.
New: The Calendar
QuickMail now has a real, keyboard-first calendar. Press Ctrl+Shift+C (or select the Calendar node in the folder tree) to open it. Move through your events with the Up and Down arrows; on any appointment, press Tab once to reach a details box with everything about it, or Enter to open the full appointment.
The Calendar page of the User Guide covers all of this in detail. In brief:
Create and manage your own appointments
Press N to create an appointment. You get a title, all-day or timed start and end (type times naturally — "9", "9:00 AM", "14:30"), location, notes, and repeat options. Press E to edit and Delete to delete; QuickMail always confirms before deleting.
Repeating appointments support Daily, Weekly, Monthly, and Yearly patterns, an "every N" interval, an optional end date, and — for weekly events — a day-of-week picker. When you edit or delete one occurrence, QuickMail asks whether you mean this event only or the whole series.
Four views and quick date navigation
Switch between Agenda, Day, Week, and Month views with A, D, W, and M. Move between periods with Ctrl+Left and Ctrl+Right, jump to today with T, and jump to any date with Ctrl+G (Go to Date). In Month view, arrow keys move day by day and Enter opens the selected day.
Reminders
Turn on Remind me before appointments in Settings → General and choose how many minutes ahead you want them. QuickMail then shows a Windows notification and announces each reminder as it comes due. Reminders are off by default.
Meeting invitations
Open an email that contains a meeting invitation and QuickMail adds an event card to the top with Accept, Tentative, and Decline buttons. Choosing one replies to the organizer and updates your calendar right away. Cancellations remove the matching entry automatically.
You can also respond straight from the calendar: an invitation you haven't answered shows as Pending, and pressing Enter on it opens a short menu — Accept, Tentative, Decline, or Open full appointment — so you can reply without leaving the calendar to find the email.
Connect an online calendar — per account
Calendars connect per account, just like contact sync. When you add an account — or later, in Manage Accounts — check Sync calendar from this account and QuickMail shows that account's calendar:
- Microsoft (Outlook.com, Microsoft 365) and Google — see your events, and create, edit, or delete single (non-repeating) events, with the change sent back to that account.
- iCloud — see your events, and create, edit, or delete single (non-repeating) events, with the change sent back to your iCloud account. QuickMail uses the app-specific password you already entered for the account, so there's nothing else to set up.
Nothing syncs until you check the box, and unchecking it removes that account's events. Connected calendars refresh in the background; F5 (or Sync Calendars Now in the command palette) refreshes on demand. Repeating appointments are always saved to your local calendar, and repeating events that come from an online calendar are read-only for now — the guide's what the calendar does and does not do list lays out the current limits.
Search and export
Press Ctrl+Shift+S to search your appointments by title, location, or notes. Export any appointment as a standard .ics file from the command palette.
Feedback welcome
Feedback on the calendar user experience and any issues you encounter with calendar management is welcome. Testing across a range of appointment types and calendar accounts has been conducted but this is a large surface area. Please see the Reporting Issues section for ways to report issues in general or provide feedback on the calendar experience.
New: More reliable new-mail sync
QuickMail primarily learns about new mail through a live server connection (IMAP IDLE). This release adds a safety net behind that connection and fixes two related reliability problems:
- A periodic new-mail check. If a server never pushes, a held connection dies quietly, or you read or flag messages in another app, QuickMail now re-checks your inboxes on a schedule. Set it in Settings → General, under Sync, at "Check for new mail every" (Off, 1, 5, 15, 30, or 60 minutes; 5 by default). Changes apply without a restart.
- No more "connection was forcibly closed" after idle. Pooled connections that have been idle for a while are now checked and reconnected before reuse, so opening a message after your machine has been sitting a while no longer fails.
- Read state stays in sync. A message you read in another client (for example, Gmail on the web) now stops showing as unread in QuickMail.
New: Quieter notifications after your computer wakes
When your computer wakes from sleep or a dropped connection reconnects, all the mail that arrived during the gap arrives at once. Previously that produced a single large "9 new messages" burst notification, and it could repeat on each wake. QuickMail now recognizes a catch-up backlog (more than a handful of messages in one batch) and skips the toast for it — the messages are still marked as seen so nothing re-fires. Real-time arrivals, a few at a time, notify normally.
Fixed: Opening a message in a tab now shows just the message
When you set messages to open in a tab (Settings → Windowing → Reading mode → Tab), activating a message opened a tab that showed a copy of the whole message list with the message itself squeezed into a small, fixed strip at the bottom — not the message on its own. Opening in a window worked correctly.
Tabs now behave as expected: opening a message in a tab fills the pane with that message, and the message list is set aside until you return to it. The message list is still there whenever you need it —
- Escape from an open message returns you to the message list (the message's tab stays open).
- Ctrl+W closes the message's tab and returns you to the list.
- The tab strip (Ctrl+Shift+T, or F6 to reach it) lets you switch between the list and any open messages.
The list also stays visible while a message is still loading, and if a message fails to load the list remains on screen rather than leaving the pane blank.
Fixed: The compose preview window no longer opens blank
Previewing the formatted (Markdown) version of a message you are composing opened a blank window on current WebView2 runtimes. The preview now renders your formatted message as expected.
Thank You to Contributors
Thank you, as always, to everyone who contributes to QuickMail through code, bug reports, feature suggestions, and other feedback — including the reports that shaped the calendar's design, the tab-open behavior found during the theming review, and the notification and sync-reliability reports.
Reporting Issues
Found a problem or have a suggestion? There are three ways to reach us — pick the one that fits:
- Report a Bug → Send (Help menu, inside QuickMail). Files the report for you anonymously — it includes no email address or other identifying information, so there is no way to follow up with you. Best when you don't want any follow-up.
- Report a Bug → Copy report and open GitHub (Help menu). Opens a pre-filled issue that you submit under your own GitHub account, so your GitHub contact information is attached. Best when you have a GitHub account and want automatic filing plus direct contact.
- Email quickmailissues@theideaplace.net. Best when you don't mind sending email and want a personal follow-up.
Full details, including exactly what a report contains (and what it never contains), are in the Reporting Issues section of the User Guide.
Internal
Full calendar (PR #273, spec docs/planning/full-calendar-pm-dev-spec.md)
- Local authoring with a modeless
EventEditorWindow(per the modal-dialog rules — editable fields over the live WebView2), master/detail list + details pane, and four views (Agenda/Day/Week/Month) driven byCalendarViewModel.ViewMode+ReferenceDate. Month is a 42-cell grid with arrow navigation and Enter-to-drill. - Recurrence is a practical RFC-5545 subset (
RecurrenceRule,RecurrenceExpander):FREQdaily/weekly/monthly/yearl...
QuickMail v0.8.32
QuickMail v0.8.32 Release Notes
Download
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.
New in 0.8.32
Contact Sync — bring your accounts' contacts into the address book
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.
- Off by default, one switch per account. When you add a Microsoft or Google account, the Add Account dialog has a Sync contacts from this account checkbox you can check before you sign in. For an account you already have, open Settings → Accounts, edit the account, and check the same box — it takes effect immediately, with no separate Save step.
- Read-only, one direction. Synced contacts flow from the server into QuickMail only; QuickMail never writes changes back to your account. Synced people appear in the address book but cannot be edited or deleted there (your own local contacts stay fully editable, even when someone has the same address). Turning the switch off again removes that account's synced contacts from QuickMail.
- One-time permission. Enabling sync asks your account for read-only access to your contacts. For Google this is folded into the same sign-in you already do; for Microsoft it is granted right after sign-in.
- Automatic and manual. QuickMail refreshes synced contacts quietly in the background (about twice a day). To pull the latest immediately, use the Sync Now button in the address book, or the Sync Contacts Now command in the Command Palette.
- An Account column in the address book. Each contact now shows where it came from — Local address book for the ones you added yourself, or the account name for synced ones. A screen reader reads each row as its plain contents ("Kelly Ford, kelly@example.com, Local address book"), the same concise style the message list uses. If you prefer to hear the field names spoken, turn on Show field labels in the contact list in Settings → General → Accessibility.
New Folder is now easy to find
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:
- A Folder → New Folder… menu item.
- A New Folder… command in the Command Palette (Ctrl+Shift+P), which you can assign your own shortcut to in keyboard customizations.
- A New Folder button in the folder picker you use when moving or copying a message — create the destination folder right there and move into it without leaving the dialog.
Fixed in 0.8.32
Personal Microsoft (Outlook.com / Hotmail) sign-in works again
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.
Replying to an HTML-only message keeps the original text
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.
Launching QuickMail after closing a message window works again
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.
Keyboard fixes in the folder tree and lists
- Pressing K in the folder tree no longer toggles a message flag. The single-key K flag shortcut now applies only when the message list or a sender/recipient group has focus; in the folder tree, K does folder type-ahead as expected.
- Shift+F10 in the folder list and account list now opens that list's own context menu instead of the message list's, and the very first Shift+F10 right after launch no longer opens the Windows system menu by mistake.
- In the move/copy folder picker, plain letter keys again jump through the folder tree by typing (the New Folder button is reached with Alt+N).
Accessibility
- Contact sync feeds the same autocomplete you already use to address messages, so the benefit is simply that more of the right people are there when you type — no new interaction to learn. The address book's new Account column is spoken as part of each row's single utterance, keeping navigation concise; the optional Show field labels in the contact list setting is there for anyone who prefers to hear the field names.
- Because the address book runs as a modal window, contact sync deliberately never pops a sign-in window while it is open (that combination can freeze the interface with a screen reader active). Consent is gathered up front when you enable sync; if a grant later lapses, QuickMail tells you to turn sync off and on again rather than surprising you with a sign-in prompt.
- The K flag key is now scoped to the message area, so it no longer competes with folder-tree type-ahead — a plain-key gesture behaves the same way as the calendar's plain-key shortcuts, which are scoped to their own list.
- New Folder is reachable by menu, Command Palette, and an assignable shortcut, so folder creation no longer depends on finding a context menu.
Thank You to Contributors
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.
Internal
Server contact sync and prior recipients (issue #256, PRs #257, #259, #263)
- One-way (server → local) pull of contacts and prior recipients from Microsoft (Graph
/me/contacts+/me/people) and Google (Peopleconnections+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-accountSyncContactstoggle (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). - New
ContactSourceprovenance onContactModel(back-compatible with oldcontacts.json),IContactSyncService/ContactSyncService, provider sources (GraphContactSource,GoogleContactSource+GooglePeopleClient), scope-awareGraphClientoverload, andRequestContactsConsentAsyncacross 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. - Refinements from testing (PR #263): fixed the address-book → compose path opening with an empty From picker (the compose VM was created but never
Seed()-ed); added the Add Account opt-in checkbox (SyncContactsmoved to the shared editor base); added the address-book Account column with concise composed accessible names and theContactListShowFieldLabelsopt-in (off by default); made the Account Manager toggle apply immediately from the checkboxClickhandler (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. - Review hardening (PR #259): contact sync acquires its Graph token silent-only — no interactive fallback — because an MSAL embedded WebView2 launched inside the address book's nested modal loop can deadlock the UI thread (the documented modal-dialog hazard, with the screen-reader path as trigger). Added
IOAuthService.GetAccessTokenSilentAsync+ asilentOnlypath throughGraphClient. Background sync throttled to 12h viaSyncAllDueAsync; the manual "Sync Contacts Now" command bypasses the throttle. - 40+ new tests across
ContactServiceSyncTests, `C...
QuickMail v0.8.31
QuickMail v0.8.31 Release Notes
Download
Two options are available for v0.8.31:
| Download | When to use |
|---|---|
QuickMail-0.8.31-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 fixes launching QuickMail while it is already running in the background: opening the app again now brings back your existing window instead of starting another copy. It includes everything from v0.8.3 — plain-text message reading, Windows notifications for new mail, the option to run in the background when you close the window, and the fix for messages sometimes staying unread in your other email clients after you had read them in QuickMail. If you installed QuickMail from the MSI, this update is delivered automatically.
Fixed in 0.8.31
Launching QuickMail while it is running no longer opens extra copies
With Keep running in the notification area when I close the window turned on, QuickMail keeps running after you close its window — and the natural way to get it back is to launch QuickMail again from the Start menu or desktop. Doing that started a whole new copy of the app each time: launch it ten times and you had ten copies running, ten tray icons, and duplicated notifications for every new message.
QuickMail now runs as a single instance. Launching it while it is already running simply restores the existing window — whether it was hidden in the notification area or just behind other windows — exactly as opening it from the tray icon would. This also protects your local mail cache, which was never designed to be shared by several running copies at once.
If you use a custom --profileDir for a separate profile, each profile still gets its own instance: one QuickMail per profile, as many profiles as you like. Thank you to the user who reported this and pinpointed exactly how the extra copies accumulated.
New in 0.8.3
Plain Text View
Read messages as plain text instead of HTML. Open Settings → General and check Read messages as plain text, or toggle it with Ctrl+Shift+H or the View → Plain Text View menu item. The preference is sticky: it persists across restarts and applies to the reading pane, message tabs, and standalone message windows. When plain-text view is on, QuickMail renders each message from its original plain-text part, falling back to text extracted from the HTML only when the sender included no plain-text part. Use it for a cleaner, low-noise read or to inspect a message's raw text for security checking.
Windows Notifications for New Mail
Get a native Windows notification when new mail arrives in an inbox. Open Settings → General → Notifications and check Show a notification when new mail arrives. Notifications are announced by screen readers and appear in the Windows notification center. Activate a notification to bring QuickMail to the front and open that message. Requires Windows 10 1809 or later.
Run in the Background When You Close the Window
Keep QuickMail running in the notification area when you close the main window, so new-mail notifications keep arriving. Open Settings → General → Notifications and check Keep running in the notification area when I close the window. The first time you close to the tray, a notification explains that QuickMail is still running. Restore the window from the tray icon, by launching QuickMail again, or by activating a notification. Use File → Exit or the tray icon's Exit QuickMail to quit.
Fixed in 0.8.3
Messages you read now show as read everywhere
After reading messages in QuickMail, some of them could still appear unread when you looked at the same mailbox in another client — Outlook, Apple Mail, or the web — or after you closed and reopened QuickMail. The messages showed as read inside QuickMail, so the problem was invisible until you checked elsewhere. It affected both Gmail and Microsoft accounts and felt random: some messages were marked read on the server and some were not.
The cause was that opening a message only reliably told the server "this is read" when QuickMail had to fetch the message body fresh. QuickMail reads ahead and caches nearby messages so they open instantly — and those pre-cached messages, which are exactly the ones you tend to read next, were being marked read only in QuickMail's own view, never on the server. Opening a message now marks it read on the server directly, whether the body came from the cache or a fresh fetch, in the reading pane, in a tab, and in a standalone message window. (Opening a message in its own window now marks it read on open, the same as the reading pane already did.)
The installer download now carries its version number
The downloaded Windows installer was always named QuickMail-win.msi, so once it was on your disk you could not tell which version it was. The installer is now published as QuickMail-<version>-win.msi — for this release, QuickMail-0.8.31-win.msi. This is a filename change only; automatic updates for existing MSI installs are unaffected.
Accessibility
- Single instance means launching QuickMail from the Start menu while it is running in the background is now a reliable, predictable way to return to your mail — the same result every time, with no duplicate tray icons to distinguish and no doubled notification announcements.
- Plain Text View provides a lower-noise reading option for users who prefer a simpler layout or want to inspect raw message text for security purposes.
- New-mail notifications are delivered as native Windows notifications, which screen readers announce automatically. Notifications appear in the Windows notification center (open it with Win+N on Windows 11, or Win+A on Windows 10). No custom in-app announcements are layered on top — the platform's native delivery is the accessibility mechanism.
- The mark-as-read fix is a server-side correction; it does not change what is announced or where focus lands when you open a message.
Thank You to Contributors
Thank you, as always, to everyone who contributes to QuickMail through code, bug reports, feature suggestions, and other feedback — including the clear report of extra copies accumulating in the notification area that led directly to this release, the report that surfaced the mark-as-read problem, and the independent confirmation that it also affected Gmail accounts.
Internal
Single instance per profile (issue #240, PR #251)
- New
Services/SingleInstanceService:App.Mainclaims a named mutex (Local\QuickMail-<sha256(profileDir)>) after the Velopack hook runs and before WPF initializes. A second launch for the same profile signals a named AutoReset event and exits; the first instance listens viaThreadPool.RegisterWaitForSingleObjectand marshals to the UI thread to callMainWindow.RestoreFromTray()(now public). Distinct--profileDirvalues hash to distinct object names, so multi-profile use still runs side by side;--helpbypasses the gate. A signal that arrives before the listener registers is not lost (the event stays set and fires on registration). Velopack update restarts are unaffected: Update.exe waits for the old process to fully exit, which destroys the mutex. - Covered by
SingleInstanceServiceTests(key stability across case/trailing separator/relative segments, per-profile mutex exclusivity, activation signaling) plus a manual two-process smoke test. An independent review of the change confirmed mutex thread affinity, startup/shutdown race handling, toast COM-activation interplay, and disposal ordering; its two out-of-scope findings are tracked as issues #252 and #253.
Mark messages read on the server when opened from cache (issue #225, PR #248)
- Root cause: opening a message set
IsReadlocally and updated the local store, but the IMAP\Seenflag was only set as a side effect ofImapMailService.GetMessageDetailAsync(which opens the folderReadWriteand callsAddFlags(\Seen)). In cached (default, non-online) mode,SelectMessageAsyncserves the detail from the local store on a cache hit and only falls back to that fetch on a miss. The prefetcher (PrefetchMessageDetailAsync,markRead: false) caches the top of the folder and the neighbors of every opened message without setting\Seen, so those messages were served from cache on open and never flagged on the server — read in QuickMail, unread everywhere else. Provider-independent; the timing dependence (whether a message had been prefetched) is why the symptom looked random. - Fix: decouple the server mark-read from the body fetch.
SelectMessageAsyncnow calls_imap.MarkReadAsync(...)explicitly (fire-and-forget via.LogFaults) when opening an unread message in cached mode — covering the reading-pane and tab paths, which both route through it.AddFlags(\Seen)is idempotent, so the cache-miss path is unaffected, and online mode already flags during its fetch, so it is skipped there. Standalone window mode (MessageWindow.LoadSelectedMessageAsync) previously auto-marked read on open through no path at all (only explicit Ctrl+Q); it now marks read after the body loads via the existingMarkReadCommand→MarkReadAction→MainViewModel.MarkMessagesReadAsyncchain, which is a no-op when already read and runs after the render so a load failure never marks an unread message. - Tests:
MarkReadOnOpenTestscovers the cache-hit path (fails withou...
QuickMail v0.8.3
QuickMail v0.8.3 Release Notes
Download
Two options are available for v0.8.3:
| Download | When to use |
|---|---|
QuickMail-0.8.3-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 plain-text message reading and Windows notifications for new mail, plus the option to run in the background when you close the window. It also fixes messages sometimes staying unread in your other email clients after you had read them in QuickMail, and puts the version number in the downloaded installer's filename. If you installed QuickMail from the MSI, this update is delivered automatically. Everything from v0.8.2, v0.8.1, and v0.8.0 — the Gmail duplicate fix, live folder unread counts, themes and the visual design system, automatic updates, the Tools menu, and in-app bug reporting — is included.
New in 0.8.3
Plain Text View
Read messages as plain text instead of HTML. Open Settings → General and check Read messages as plain text, or toggle it with Ctrl+Shift+H or the View → Plain Text View menu item. The preference is sticky: it persists across restarts and applies to the reading pane, message tabs, and standalone message windows. When plain-text view is on, QuickMail renders each message from its original plain-text part, falling back to text extracted from the HTML only when the sender included no plain-text part. Use it for a cleaner, low-noise read or to inspect a message's raw text for security checking.
Windows Notifications for New Mail
Get a native Windows notification when new mail arrives in an inbox. Open Settings → General → Notifications and check Show a notification when new mail arrives. Notifications are announced by screen readers and appear in the Windows notification center. Activate a notification to bring QuickMail to the front and open that message. Requires Windows 10 1809 or later.
Run in the Background When You Close the Window
Keep QuickMail running in the notification area when you close the main window, so new-mail notifications keep arriving. Open Settings → General → Notifications and check Keep running in the notification area when I close the window. The first time you close to the tray, a notification explains that QuickMail is still running. Restore the window from the tray icon, by double-activating the icon, or by activating a notification. Use File → Exit or the tray icon's Exit QuickMail to quit.
Fixed in 0.8.3
Messages you read now show as read everywhere
After reading messages in QuickMail, some of them could still appear unread when you looked at the same mailbox in another client — Outlook, Apple Mail, or the web — or after you closed and reopened QuickMail. The messages showed as read inside QuickMail, so the problem was invisible until you checked elsewhere. It affected both Gmail and Microsoft accounts and felt random: some messages were marked read on the server and some were not.
The cause was that opening a message only reliably told the server "this is read" when QuickMail had to fetch the message body fresh. QuickMail reads ahead and caches nearby messages so they open instantly — and those pre-cached messages, which are exactly the ones you tend to read next, were being marked read only in QuickMail's own view, never on the server. Opening a message now marks it read on the server directly, whether the body came from the cache or a fresh fetch, in the reading pane, in a tab, and in a standalone message window. (Opening a message in its own window now marks it read on open, the same as the reading pane already did.)
The installer download now carries its version number
The downloaded Windows installer was always named QuickMail-win.msi, so once it was on your disk you could not tell which version it was. The installer is now published as QuickMail-<version>-win.msi — for this release, QuickMail-0.8.3-win.msi. This is a filename change only; automatic updates for existing MSI installs are unaffected.
Accessibility
- Plain Text View provides a lower-noise reading option for users who prefer a simpler layout or want to inspect raw message text for security purposes.
- New-mail notifications are delivered as native Windows notifications, which screen readers announce automatically. Notifications appear in the Windows notification center (open it with Win+N on Windows 11, or Win+A on Windows 10). No custom in-app announcements are layered on top — the platform's native delivery is the accessibility mechanism.
- The mark-as-read fix is a server-side correction; it does not change what is announced or where focus lands when you open a message.
Thank You to Contributors
Thank you, as always, to everyone who contributes to QuickMail through code, bug reports, feature suggestions, and other feedback — including the report that surfaced the mark-as-read problem and the independent confirmation that it also affected Gmail accounts.
Internal
Mark messages read on the server when opened from cache (issue #225, PR #248)
- Root cause: opening a message set
IsReadlocally and updated the local store, but the IMAP\Seenflag was only set as a side effect ofImapMailService.GetMessageDetailAsync(which opens the folderReadWriteand callsAddFlags(\Seen)). In cached (default, non-online) mode,SelectMessageAsyncserves the detail from the local store on a cache hit and only falls back to that fetch on a miss. The prefetcher (PrefetchMessageDetailAsync,markRead: false) caches the top of the folder and the neighbors of every opened message without setting\Seen, so those messages were served from cache on open and never flagged on the server — read in QuickMail, unread everywhere else. Provider-independent; the timing dependence (whether a message had been prefetched) is why the symptom looked random. - Fix: decouple the server mark-read from the body fetch.
SelectMessageAsyncnow calls_imap.MarkReadAsync(...)explicitly (fire-and-forget via.LogFaults) when opening an unread message in cached mode — covering the reading-pane and tab paths, which both route through it.AddFlags(\Seen)is idempotent, so the cache-miss path is unaffected, and online mode already flags during its fetch, so it is skipped there. Standalone window mode (MessageWindow.LoadSelectedMessageAsync) previously auto-marked read on open through no path at all (only explicit Ctrl+Q); it now marks read after the body loads via the existingMarkReadCommand→MarkReadAction→MainViewModel.MarkMessagesReadAsyncchain, which is a no-op when already read and runs after the render so a load failure never marks an unread message. - Tests:
MarkReadOnOpenTestscovers the cache-hit path (fails without the fix) and the already-read no-op case; verified the cache-hit test fails on a stashed tree and passes with the fix. An independent review approved the change (no double-flag in online mode, cache-miss path unaffected, null-safe window wiring).
Versioned installer filename (issue #244)
vpk packalways emits the MSI as the version-lessQuickMail-win.msi. The release workflow now renames the packed MSI toQuickMail-<version>-win.msiafter packing and uploads that (glob still covered byfail_on_unmatched_files). Filename only; the MSI's internalProductVersionis unchanged. Workflow-only change, no application code impact.
Plain Text View (issue #34)
- Added a sticky "Plain Text View" preference, configurable via the View menu, a Ctrl+Shift+H hotkey, and a Settings checkbox. When on, messages render from their original
text/plainMIME part (falling back to text extracted from HTML only when the sender provided no plain-text part). The setting persists across restarts and applies to all three reading surfaces (reading pane, tab, and standalone window). Default is off. Plain-text rendering reuses the existingBuildPlainTextHtmlDocumentbuilder; a new optionalforcePlainTextparameter routes callers through the plain-text branch.
Windows Notifications for New Mail (issue #240)
- Two new features enable Windows native notifications for new mail and background-running when the window is closed. Phase 1 adds
INotificationService/WindowsToastNotificationService(requires Windows 10 1809+) and aNotifyOnNewMailconfig flag (opt-in, off by default). The service hooks into the existingInboxNewMailDetectedevent; a dedupe filter (by session start time, read status, and message key) prevents duplicate toasts. Activating a single-message toast opens that message; multi-message toasts bring the app forward. Phase 2 addsCloseToTrayandTrayHintShownflags; whenCloseToTrayis on, closing the window hides it to the notification area (system tray) instead of exiting, so the IDLE/delta watchers keep running. Exit can be triggered explicitly via File → Exit or the tray icon's Exit menu item. Both features require explicit opt-in in Settings → General → Notifications.
Not shipped in this build
- Planning specs landed on
mainsince v0.8.2 but are not implemented in this release: the Windows mail-client registration spec, the message-selection multi-select spec, and the issue #245 MSI upgrade-UX investigation notes. They are documentation only and have no runtime effect here.
Version
- Bumped to
0.8.3(Version,AssemblyVersion,FileVersion).
QuickMail v0.8.2
QuickMail v0.8.2 Release Notes
Download
Two options are available for v0.8.2:
| Download | When to use |
|---|---|
QuickMail-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 is a fixes release on top of v0.8.1. It resolves a long-standing Gmail problem where the same message appeared many times, makes folder unread counts update as you read, keeps spell check inside your own text when replying and forwarding, makes Google and Microsoft account reconnection more reliable, and fixes a crash when pasting certain text into an address field. If you installed QuickMail from the MSI, this update is delivered automatically. Everything from v0.8.1 and v0.8.0 — themes and the visual design system, automatic updates, the Tools menu, and in-app bug reporting — is included.
Fixed in 0.8.2
Gmail: the same message no longer appears many times
On Google accounts, the main All Mail view could show the same message repeated over and over. This happened because Gmail presents one message in several folders at once — Inbox, All Mail, and every label it carries — and QuickMail was listing each of those copies separately.
QuickMail now recognizes when copies in different folders are the same message and shows each message once in All Mail, the per-account All Mail, conversations, and the by-sender and by-recipient groupings. Opening a message, marking it read, flagging, or deleting acts on the most natural copy — the one in your Inbox when the message is there. Individual folders (Inbox, a specific label) are unchanged: they show exactly their own contents.
The first time you start this version, QuickMail rebuilds its message cache so the change takes effect, so you may see a brief "syncing" pass on launch. Your accounts, settings, and message bodies are untouched.
Folder unread counts now stay up to date
The unread count shown next to each folder was a snapshot taken when QuickMail connected, and it did not change afterward — reading, deleting, or moving messages, new mail arriving, or a sync would not update it until you reconnected. Now the counts refresh shortly after you read a message (including simply opening it), delete or move messages, new mail arrives, or a sync completes. On Gmail, where reading one message can change several folders' counts at once, all of the affected counts update together. The counts update in place, so your position in the folder list is not disturbed, and the count is spoken as part of each folder's name.
Gmail folders that don't mean "new mail." Gmail's All Mail folder holds every message you have ever received — including old, archived mail — so its "unread" count is the total of everything unread across your whole account, not new mail to read. That is why it could show a large number (for example, 23 unread) even when your inbox was empty. QuickMail no longer shows an unread count on Gmail's virtual folders — All Mail, Important, and Starred — and no longer counts them toward your account's unread total, so the total reflects real new mail. Your Inbox, Spam, Trash, and label folders show their counts exactly as before. (One consequence: an unread message that lives only in one of those hidden folders — for example a message you starred and then archived — is not counted; it is still visible when you open that folder.)
Spell check stays in your own text on reply and forward
Starting a spell check (F7) while replying or forwarding used to continue past the end of your own writing and into the quoted original message, prompting you about words other people wrote. Spell check now stops at the start of the quoted original — the "On … wrote:" line on a reply or the "Forwarded message" header on a forward — in plain text, Markdown, and HTML messages. The subject line is still checked in full, and a brand-new message (with nothing quoted) is checked exactly as before.
One current limit: if you have a signature configured, it is added below the quoted message, so it is not part of this spell check on a reply or forward. This is noted for a future update.
Connecting Google and Microsoft accounts is more reliable
Several rough edges in reconnecting Google (OAuth) and Microsoft accounts are fixed:
- A reconnecting account could wrongly report "No password stored" even though these accounts do not use a stored password.
- A routine background reconnect could briefly pop up a sign-in prompt and then cancel it; background reconnects are now silent, and a sign-in window only appears when one is genuinely needed.
- Google sign-in now requests the standard per-service permission scope, which is the more compatible choice.
Crash fixed when pasting certain text into an address field
Pasting some comma-containing text into a To, Cc, or Bcc field could crash QuickMail. That path is fixed.
Deleting a whole selection from the context menu
When several messages were selected — for example with Select All (Ctrl+A) or Shift+Arrow — choosing Delete from the right-click menu removed only the one message the cursor was on, leaving the rest of the selection in place. Delete from the context menu now removes every selected message, matching the Delete key and the Move to Folder / Copy to Folder menu commands.
Accessibility
- Folder unread counts are part of each folder's spoken name and update in place — no rebuilding of the folder list, so focus and your place in the tree are preserved when a count changes.
- Deduplicating Gmail messages does not change focus behavior; the message list, conversation view, and sender/recipient groupings simply show each message once.
- Spell check on a reply or forward no longer walks you through the quoted original's words.
- Select All (Ctrl+A) followed by Delete from the message context menu now removes the entire announced selection, not just the focused message. Focus lands on the next message in place after the deletion.
Thank You to Contributors
Thank you, as always, to everyone who contributes to QuickMail through code, bug reports, feature suggestions, and other feedback — including the reports that surfaced the Gmail duplicates, the folder-count behavior, and the reply/forward spell-check issue in this release.
Internal
Gmail duplicate collapse (issue #220, PR #224)
- Root cause: messages were identified by their per-folder IMAP UID and the RFC 5322
Message-IDwas fetched but discarded, so the "All Mail" aggregate unioned every folder's copy with no cross-folder dedup. Gmail exposes one message in INBOX +[Gmail]/All Mail+ Important + Starred + every label, each with a distinct UID. - Fix: persist the normalized
Message-IDonMailMessageSummary(schema v5, one-time cache clear so it backfills on next sync) and collapse copies in aggregate views by(account, Message-ID)via a newMessageDeduplicator. Empty Message-IDs and cross-account are never merged; the representative is chosen by folder priority (Inbox > user label > Gmail virtual folders). Applied at every aggregate choke point — All Mail, per-account All Mail, saved views (batch and incremental), and the live sync path — so the flat list, conversations, and sender/recipient groups all dedup. Single real-folder views are untouched. Provider-agnostic; Outlook/IMAP with unique Message-IDs see no change. - An independent review confirmed correctness (no cross-account/empty-id merges; migration safe for fresh/v1/v2–v4 databases) and one behavioral edge was fixed:
RemoveVanishedMessagesnow keys on global identity so archiving a Gmail message out of Inbox doesn't transiently drop its representative. Full suite green.
Folder unread-count refresh (issue #227, PRs #229 and #232)
- Folder
UnreadCountwas set only at folder-list load and never updated afterward. A debounced, server-authoritative refresh now re-queries IMAPSTATUSafter the read (including open/select), delete, move, new-mail, and sync paths (coalescing bursts, with a per-account minimum interval between sweeps) and writes counts onto the existing folder models, updating the tree nodes in place — no tree rebuild, so folder-tree keyboard focus is preserved. Server-authoritative (not optimistic decrement) so Gmail's cross-label\Seenpropagation is reflected across every affected folder. - Accessibility: the count is carried in the folder's
AutomationProperties.Name, not onlyItemStatus— a screen-reader user confirmed that a count inItemStatusalone is not announced. The visible label stays count-free (the count shows as a badge), andAutomationNameis a computed value refreshed in place, so the count is both announced and kept current without doubling. - Gmail virtual folders:
MailFolderModel.SuppressUnreadCount(KindAllMail/Important/Starred, from the SPECIAL-USE\All/\Important/\Flaggedattributes) hides the unread count in the tree and excludes it fromaccount.TotalUnread, since those folders'UNSEENcounts overlap the Inbox/labels and include archived mail ([Gmail]/All Mailis the whole-account superset). Accepted tradeoff: an unread message present only in a suppressed folder is not counted. - Two independent reviews (one per PR). The first caught the accessibility issue above (count must be in the Name). The second caught that the delete-path refresh was scheduled before the awaited move-to-trash — the debounced sweep could read a pre-delete count and clobber the optimistic decrement — now sc...
QuickMail v0.8.1
QuickMail v0.8.1 Release Notes
Download
Two options are available for v0.8.1:
| Download | When to use |
|---|---|
QuickMail-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 is a stability release on top of v0.8.0. It fixes an intermittent freeze that could occur when opening a reply, and it is the first update delivered automatically to installed copies. Everything introduced in v0.8.0 — themes and the visual design system, automatic updates, the Tools menu, and in-app bug reporting — is included, and the full v0.8.0 notes are reproduced below because they bubble down as this release moves to the top of the releases page.
Fixed in 0.8.1: intermittent freeze when opening a reply
On some systems, opening a Reply, Reply All, or Forward could intermittently freeze QuickMail — the window stopped responding to the keyboard and had to be closed from Task Manager. It was most likely to happen when starting a reply directly from an open message while a screen reader was running, and especially on Windows-on-ARM machines, where QuickMail runs under emulation that widens the timing window.
The cause was a timing collision at the exact moment the compose window opened. QuickMail was building the compose window in the middle of handling a keystroke that had arrived from the reading pane's web-based view, and the two cross-process calls involved — one to the reading pane, one to the accessibility layer — could deadlock the interface. QuickMail now opens the compose window a fraction of a second later, after that keystroke has finished being handled, which removes the collision entirely. In normal use the change is invisible: the compose window opens exactly as before.
This is the third and, we believe, the decisive fix in a family of related freezes tracked over the 0.8.0 cycle (issues addressed in #190, #198, and now #181/#209); unlike the earlier two, this one removes the underlying trigger the whole family shared rather than one symptom.
Updating to 0.8.1
If you installed QuickMail 0.8.0 from the MSI, you receive 0.8.1 automatically — this is the first release to exercise that path end to end. The update downloads quietly in the background and installs the next time you exit and reopen QuickMail; Help → About will then read 0.8.1. If you are still on a version before 0.8.0 (the older Inno Setup installer), the one-time reinstall step described in the carried-over 0.8.0 notes below still applies to get you onto the automatic-update track.
Included from v0.8.0
v0.8.0 introduced theming and a visual design system: light and dark themes, app-wide text scaling and font choice, and a Theme Manager for creating, sharing, and hand-editing themes. See the Themes section of the User Guide for the full walkthrough. It also introduced automatic updates — installed copies of QuickMail now keep themselves current, with you in control throughout. And it added an always-available Tools menu and in-app bug reporting that doesn't require a GitHub account.
Automatic updates
Starting with the 0.8.0 release, QuickMail keeps itself up to date. When a newer version is
available, the installed app downloads it quietly in the background and installs it the next
time you exit and reopen QuickMail — no download page, no installer to run, no security
warnings. The Help menu continues to show whether you are current, offers a Restart to
Update option when a new version is waiting, and the first start after an update confirms
what was installed. You stay in control throughout: automatic updating and its notifications
can each be turned off in Settings → Advanced, with manual updating always available. See
the Installing and Updating section of the User Guide
for the full walkthrough.
One-time step for existing installed users
The 0.8.0 release moved to a new installer, so getting onto the automatic-update track requires
one manual reinstall — this applies only if you are still on a version before 0.8.0:
- Uninstall your current QuickMail from Settings → Apps. When the uninstaller offers to
delete user data, choose No. - Download and run QuickMail-win.msi from this release page. A standard setup wizard
walks through the license and installation. - Start QuickMail. All your accounts, settings, contacts, rules, templates, saved views, and
cached mail are exactly as you left them.
Your data is safe throughout: settings and mail live in a separate location the installer
never touches, and passwords stay in Windows Credential Manager. After this one reinstall,
all future updates are automatic.
Notes on the install:
- QuickMail installs per-user (no administrator prompt). The previous option to install
for all users is gone. - A Start Menu entry is created. The first time QuickMail starts, it asks whether to add a
desktop shortcut; the choice can be changed anytime in Settings → General. - Uninstalling asks whether to also remove your data — and unlike before, choosing Yes
also clears QuickMail's saved passwords from Windows Credential Manager.
Portable exe users
Nothing changes. QuickMail.exe remains a single-file download that you update manually;
the Help menu still tells you when a new version is available.
Themes
QuickMail has a color theme, chosen in Settings → Appearance. Six themes ship built in:
- System — follows the Windows light or dark setting.
- Parchment (the default light look) — warm off-whites with a muted steel-blue accent.
- Parchment Dark — the dark counterpart.
- Ember (warm), Fjord (cool), and Heather (muted) — light variants with different accent and selection colors.
Theme changes apply immediately — no restart. An open message re-renders in the new colors without moving focus.
Understanding a theme without seeing it
Every theme carries a plain-language Theme description — a written account of its overall look, its fonts, and each individual color together with exactly where that color is used (message list, links, selection, focus outline, error and status text, and so on). Color values are translated into words like "dark muted blue" or "warm off-white," with the nearest well-known color name for reference. The Theme Manager shows this description for whichever theme is selected, in a read-only text box you can read or hear at your own pace, so themes can be understood and compared without seeing the colors.
Text size, font, and vision settings
The Appearance tab also gives you:
- Text size — scale all app text using fixed stops at 100%, 110%, 125%, 150%, 175%, and 200%, independent of Windows display scaling. The chosen size flows through every window.
- Font — override the app font, or keep the theme's own font.
- Always underline links — underline links everywhere, not just by color.
- Thicker keyboard focus indicators — widen the focus outline for easier tracking.
- Apply theme colors to message content — override a sender's hard-to-read colors and fonts in the reading pane with your theme's colors. Off by default, so messages render as their sender intended unless you turn it on.
The Theme Manager
Choose Manage Themes… from the Tools menu, or Manage Themes from the Command Palette (Ctrl+Shift+P), to open the Theme Manager. It is a separate, non-blocking window, so you can leave it open and try themes against real messages. From the theme list, press Tab to reach the actions:
- Apply — switch to the selected theme immediately.
- Duplicate — copy a theme as a starting point for your own.
- Rename / Delete — for your own themes.
- Export… — save a theme as a shareable
.quickmailthemefile. - Import… — load a
.quickmailthemefile. If a file has a problem, QuickMail tells you exactly what is wrong (for example, which color value is not a valid hex color). - Open themes folder — open the folder where your themes are stored, for hand-editing.
A theme is a plain, documented JSON text file: duplicate a built-in theme, open the themes folder, and edit the copy in any text editor. Any color you leave out is filled in from the built-in Light or Dark theme.
The Command Palette also offers Next Theme and Previous Theme, and a Theme: [name] command for each theme. None of these carry a default shortcut — assign one in Settings → Keyboard if you want direct access.
The Tools menu
The main window has an always-available Tools menu, grouping the commands used less often than day-to-day mail actions: Manage Themes…, Next Theme, Previous Theme, Address Book… (Ctrl+Shift+B), Rules… (Ctrl+Shift+L), and Command Palette… (Ctrl+Shift+P). Address Book, Rules, and Command Palette moved here from their previous menus, so each command now lives in exactly one place; their keyboard shortcuts are unchanged.
Windows High Contrast
When Windows High Contrast is on, QuickMail steps aside entirely — every color comes from your Windows High Contrast palette, QuickMail's own control styling is withdrawn so the system's High Contrast controls take over, and the reading pane defers to the browser's forced-colors handling. Your theme choice is remembered and returns automatically when...
QuickMail v0.8.0
QuickMail v0.8.0 Release Notes
Download
Two options are available for v0.8.0:
| Download | When to use |
|---|---|
QuickMail-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 introduces theming and a visual design system: light and dark themes, app-wide text scaling and font choice, and a Theme Manager for creating, sharing, and hand-editing themes. See the Themes section of the User Guide for the full walkthrough. It also introduces automatic updates — installed copies of QuickMail now keep themselves current, with you in control throughout. And it adds an always-available Tools menu and in-app bug reporting that doesn't require a GitHub account.
New: Automatic updates
Starting with this release, QuickMail keeps itself up to date. When a newer version is
available, the installed app downloads it quietly in the background and installs it the next
time you exit and reopen QuickMail — no download page, no installer to run, no security
warnings. The Help menu continues to show whether you are current, offers a Restart to
Update option when a new version is waiting, and the first start after an update confirms
what was installed. You stay in control throughout: automatic updating and its notifications
can each be turned off in Settings → Advanced, with manual updating always available. See
the Installing and Updating section of the User Guide
for the full walkthrough.
One-time step for existing installed users
This release uses a new installer, so getting onto the automatic-update track requires one
manual reinstall:
- Uninstall your current QuickMail from Settings → Apps. When the uninstaller offers to
delete user data, choose No. - Download and run QuickMail-win.msi from this release page. A standard setup wizard
walks through the license and installation. - Start QuickMail. All your accounts, settings, contacts, rules, templates, saved views, and
cached mail are exactly as you left them.
Your data is safe throughout: settings and mail live in a separate location the installer
never touches, and passwords stay in Windows Credential Manager. After this one reinstall,
all future updates are automatic.
Notes on the new install:
- QuickMail now installs per-user (no administrator prompt). The previous option to install
for all users is gone. - A Start Menu entry is created. The first time QuickMail starts, it asks whether to add a
desktop shortcut; the choice can be changed anytime in Settings → General. - Uninstalling now asks whether to also remove your data — and unlike before, choosing Yes
also clears QuickMail's saved passwords from Windows Credential Manager.
Portable exe users
Nothing changes. QuickMail.exe remains a single-file download that you update manually;
the Help menu still tells you when a new version is available.
New: Themes
QuickMail now has a color theme, chosen in Settings → Appearance. Six themes ship built in:
- System — follows the Windows light or dark setting.
- Parchment (the new default light look) — warm off-whites with a muted steel-blue accent.
- Parchment Dark — the dark counterpart.
- Ember (warm), Fjord (cool), and Heather (muted) — light variants with different accent and selection colors.
Theme changes apply immediately — no restart. An open message re-renders in the new colors without moving focus.
Understanding a theme without seeing it
Every theme carries a plain-language Theme description — a written account of its overall look, its fonts, and each individual color together with exactly where that color is used (message list, links, selection, focus outline, error and status text, and so on). Color values are translated into words like "dark muted blue" or "warm off-white," with the nearest well-known color name for reference. The Theme Manager shows this description for whichever theme is selected, in a read-only text box you can read or hear at your own pace, so themes can be understood and compared without seeing the colors.
New: Text size, font, and vision settings
The Appearance tab also gives you:
- Text size — scale all app text using fixed stops at 100%, 110%, 125%, 150%, 175%, and 200%, independent of Windows display scaling. The chosen size flows through every window.
- Font — override the app font, or keep the theme's own font.
- Always underline links — underline links everywhere, not just by color.
- Thicker keyboard focus indicators — widen the focus outline for easier tracking.
- Apply theme colors to message content — override a sender's hard-to-read colors and fonts in the reading pane with your theme's colors. Off by default, so messages render as their sender intended unless you turn it on.
New: the Theme Manager
Choose Manage Themes… from the new Tools menu, or Manage Themes from the Command Palette (Ctrl+Shift+P), to open the Theme Manager. It is a separate, non-blocking window, so you can leave it open and try themes against real messages. From the theme list, press Tab to reach the actions:
- Apply — switch to the selected theme immediately.
- Duplicate — copy a theme as a starting point for your own.
- Rename / Delete — for your own themes.
- Export… — save a theme as a shareable
.quickmailthemefile. - Import… — load a
.quickmailthemefile. If a file has a problem, QuickMail tells you exactly what is wrong (for example, which color value is not a valid hex color). - Open themes folder — open the folder where your themes are stored, for hand-editing.
A theme is a plain, documented JSON text file: duplicate a built-in theme, open the themes folder, and edit the copy in any text editor. Any color you leave out is filled in from the built-in Light or Dark theme.
The Command Palette also offers Next Theme and Previous Theme, and a Theme: [name] command for each theme. None of these carry a default shortcut — assign one in Settings → Keyboard if you want direct access.
New: the Tools menu
The main window now has an always-available Tools menu, grouping the commands used less often than day-to-day mail actions: Manage Themes…, Next Theme, Previous Theme, Address Book… (Ctrl+Shift+B), Rules… (Ctrl+Shift+L), and Command Palette… (Ctrl+Shift+P). Address Book, Rules, and Command Palette moved here from their previous menus, so each command now lives in exactly one place; their keyboard shortcuts are unchanged.
Windows High Contrast
When Windows High Contrast is on, QuickMail steps aside entirely — every color comes from your Windows High Contrast palette, QuickMail's own control styling is withdrawn so the system's High Contrast controls take over, and the reading pane defers to the browser's forced-colors handling. Your theme choice is remembered and returns automatically when High Contrast is turned off. Font and text-size settings continue to apply.
New: Report a Bug
Help → Report a Bug opens a report window without requiring a GitHub account. Fill in a summary and, optionally, what happened, what you expected, and steps to reproduce — a Preview area always shows exactly what will be sent. QuickMail submits the report directly to GitHub Issues using its own narrowly-scoped, app-owned credential, and shows a link to the created issue on success. If sending isn't possible (no credential available, or the request fails), Copy report and open GitHub copies your report to the clipboard and opens a pre-filled issue page in your browser instead. By deliberate design, the only things sent are what you type plus a short Environment section of non-sensitive details — currently the QuickMail version, your Windows version, the .NET runtime version, the active theme, the current view (message grouping, plus the saved view name if one is applied), and the message sort order. No message content, email addresses, account settings, credentials, or log file content is ever collected — and the Preview shows the whole report so you can confirm before sending.
Accessibility
- The update dialogs are small native dialogs: focus lands on the primary action, Escape always dismisses, and closing them returns focus to the message list. A found update is announced once; the background check itself is silent when you are already current.
- Theme switching never moves focus, collapses trees, or clears selection; the only thing that re-renders is the open message.
- Every custom announcement continues to respect your Screen Reader Announcements settings; theme and High Contrast changes are announced as status, and Theme Manager outcomes as results.
- Every built-in theme meets the WCAG contrast policy (4.5:1 for text, 3:1 for indicators and status colors) — enforced automatically by a unit test, so a theme that would fail contrast cannot ship.
- The Report a Bug preview is a genuine editable
TextBox(edits blocked in code, not by making it read-only), so arrow-key navigation through the preview behaves the same as any other text field instead of losing character-by-character review. Its window title reads and announces as "Report a Bug - QuickMail".
Thank You to Contributors
Thank you...
QuickMail v0.7.9.1
QuickMail v0.7.9.1 Release Notes
Download
Two options are available for v0.7.9.1:
| Download | When to use |
|---|---|
quickmail-v0.7.9.1-setup.exe — Windows installer |
Recommended for most users. Installs per-user with no elevation required, checks for the WebView2 Runtime, and registers an uninstaller. |
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 is a small follow-up release on top of v0.7.9; there are no functional changes to mail handling.
Bug Fixes
-
Stray underscores across the interface are gone (issue #168). In several places the interface showed literal underscore characters — field labels in the Manage Accounts and Add Account dialogs (for example "_Account Name", "SMTP H_ost"), the From and Subject labels in Compose, the Insert Link labels, and every button on the main toolbar ("_New", "Reply _All", "For_ward", "Refres_h"). Those underscores are the markers that turn a letter into a keyboard access key, and in these spots they were being drawn on screen instead of doing their job — which also meant a screen reader read the underscore aloud as part of the field name. Field labels now register their access key correctly (the underscore becomes an underline shown when you press Alt, and screen readers announce a clean name). Toolbar buttons no longer carry access keys at all, matching how standard Windows toolbars work — they read as plain text (New, Reply, Reply All, Forward, Delete, Refresh, Empty Trash, Accounts, User Guide) and are still reachable by their existing Ctrl shortcuts, tooltips, and Tab/arrow navigation.
-
The Help menu now shows the running version (issue #169). When you check for updates and you are already up to date, the entry reads "No updates available — running version 0.7.9.1", so you can always confirm which build you are on. The version reported to your screen reader and to File Explorer is now clean digits as well, rather than a long string with an appended build identifier.
Thank You to Contributors
Special thanks to Brian Vogel (@britechguy) for reporting issue #168, which flagged the stray underscores scattered through the interface. Those characters had lingered longer than they should have — a good reminder that even when you navigate QuickMail by screen reader every day, it is easy to stop noticing a rough edge you have walked past a hundred times. Thank you, Brian, for the careful eye and the clear report; this is exactly the kind of feedback that keeps the app honest and makes it better for everyone.
Thank you, as always, to everyone who contributes to QuickMail through code, bug reports, feature suggestions, and other feedback.
Internal
Access-key cleanup (issue #168)
-
Field labels in
AccountManagerDialog,AddAccountDialog,ComposeWindow(From/Subject), andInsertLinkDialogwereTextBlocks with underscore mnemonics.TextBlockdoes not process access keys, so the underscore rendered literally and, because each label is the field'sAutomationProperties.LabeledBysource, a screen reader announced "underscore Account Name" as the field name. They are nowLabelcontrols with aTargetbinding (the patternAddressBookWindowalready used), so the mnemonic renders as an underline and the accessible name is clean. -
Mnemonic letters were reworked to remove access-key collisions (both within the dialogs and against the top-level menu letters), rather than the earlier self-colliding scheme that forced mid-word placements.
-
Toolbar buttons rendered their underscores literally because a WPF
ToolBarre-templates its child buttons with a flat template whoseContentPresenterleavesRecognizesAccessKey = false. Verified with aRenderTargetBitmapprobe: plain buttons, menu items, and labels recognize the key; onlyToolBarchildren do not. Rather than force the mnemonic throughAccessText, the toolbar access keys were removed — every toolbar button already has a Ctrl accelerator, a tooltip, and anAutomationProperties.Name. Menu (MenuItem.Header) mnemonics were left unchanged, as they render correctly and are standard.
Running version and version reporting (issue #169)
- The Help "check for updates" entry now appends the running version at rest, sourced from a shared
Helpers.AppVersion.Displayhelper. IncludeSourceRevisionInInformationalVersionis set tofalse, so the informational/product version is clean digits (0.7.9.1) instead of0.7.9.1+<git sha>— that value is what File Explorer's Product version and screen readers report programmatically.AppVersion.Displayshows the 4th (revision) component only when it is non-zero, so normal releases read "0.7.9" and a hotfix reads "0.7.9.1". It is used by the About dialog, the Help entry, the SMTP User-Agent, and the update check. Because the update check parses this string, the hotfix build compares at full precision and does not mistake its own release for a newer one.
Version
- Bumped to
0.7.9.1(Version,AssemblyVersion,FileVersion).
QuickMail v0.7.9
QuickMail v0.7.9 Release Notes
Download
Two options are available for v0.7.9:
| Download | When to use |
|---|---|
quickmail-v0.7.9-setup.exe — Windows installer |
Recommended for most users. Installs per-user with no elevation required, checks for the WebView2 Runtime, and registers an uninstaller. |
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.
New: the Check Spelling dialog
Compose windows now have a full dialog-based spelling review, modeled on the classic word-processor spelling dialog. Press F7 (or choose Tools → Check Spelling…) to review the entire message: the check walks the body first, then the subject line, stopping on each word that is not in the dictionary. For each word you can:
- Change (Alt+C or Enter) — replace this occurrence with the "Change to" text
- Change All (Alt+L) — also replace later occurrences automatically for the rest of the check
- Ignore (Alt+I) — skip this occurrence
- Ignore All (Alt+G) — skip this word for the rest of the check
- Add to Dictionary (Alt+A) — never flag this word again, anywhere in QuickMail
- Read in Context (Alt+R) — hear the full line containing the word
When the dialog opens on a word, the word is announced and the first suggestion is selected in the Suggestions list, so screen readers voice both automatically. Arrow through the suggestions to pick a different one; the check ends with a confirmation of how many words were changed.
Custom dictionary
Add to Dictionary stores words in custom.lex in your profile folder — one word per line. Added words stop being flagged everywhere (dialog, inline navigation, and squiggles) immediately and persist across restarts. You can edit the file by hand in a text editor to remove words.
Subject line spell checking
The subject line is now spell-checked, both in the F7 review (checked after the body) and with inline squiggles while you type.
Changed keyboard shortcuts — please note
F7 now opens the Check Spelling dialog. The previous inline navigation keys have moved:
| Action | Old key | New key |
|---|---|---|
| Check Spelling (dialog) | — | F7 |
| Next misspelling (inline) | F7 | Ctrl+F7 |
| Previous misspelling (inline) | Shift+F7 | Ctrl+Shift+F7 |
Alt+F7 (repeat spelling announcement) and Alt+1/2/3 (apply a suggestion inline) are unchanged. If you had customized these shortcuts in the keyboard customizations dialog, your bindings are untouched — these are new defaults only, and all three commands can be rebound there.
The compose Tools menu now groups all spelling commands at the top: Check Spelling…, Next/Previous Misspelling (moved from the Edit menu), and Toggle Spelling Announcements.
Improved security and resource management (Fable5CR)
Security hardening
- URI allow-list (
ExternalUriPolicy) — Every URI that leaves the app viaShellExecute(reading pane links, message windows, markdown preview, update page) now goes through a configurable http/https/mailto allow-list. Everything else is logged and dropped. This closes the attack surface for social engineering attacks via crafted message content. - Attachment safety — New
AttachmentSafetyservice consolidates filename sanitization (directory stripping, invalid characters, trailing dots and spaces) and enforces an expanded dangerous-file-extension list, closing the path-traversal gap. - HTML sanitizer fail-closed — If the HTML sanitizer's regex timeout during stripping, the app falls back to reader mode rather than rendering partially stripped HTML. The actual security boundary is CSP, which remains in place for all navigation and scripting.
Resource management
GraphMailServiceis now properly disposed inApp.OnExit(it owns anHttpClientvia theGraphClient).MainViewModelnow implementsIDisposableand is disposed when the main window closes, releasing its sevenCancellationTokenSourceinstances and calendar timer.- Compose window autocomplete
CancellationTokenSourceis properly cancelled and disposed on tab switch and window close. ConfigServicenow writesconfig.iniandhotkeys.jsonatomically via temp file + rename, matching the pattern used for account and view persistence.
MVVM and testability improvements
- New
IUiDispatcherservice centralizes allDispatchercalls out ofMainViewModel, improving testability and MVVM compliance. - Win32 file dialogs are no longer called directly from
ViewModels; they are now wired through View-layer callbacks. - 82 new unit tests added (URI policy, attachment safety, sanitizer behavior, config persistence, main window lifecycle, compose attachment behavior, background task fault logging). Full test suite: 879/879 passing.
Reliability
- Background
Task.Runcalls now useTask.LogFaults(context)so failures are logged promptly instead of surfacing at finalization. Applied to local store writes, mark-read batches, and preview fetch operations. SyncServicepreview batch now has a per-folder catch block so a single folder failure cannot stop the rest.- MSAL token-cache registration is now lazy and asynchronous instead of blocking the
OAuthServiceconstructor.
Thank You to Contributors
Thank you to everyone who has contributed to QuickMail through code, bug reports, feature suggestions, and other feedback. Your contributions make the project better for everyone.
Internal
Check Spelling implementation (PR #167)
CustomDictionaryServiceowns{ProfileDir}\custom.lex(UTF-16 LE with BOM, the encoding the WPF spell engine reads most reliably) and re-registers the lexicon on all three compose editors when a word is added, so new words stop being flagged without reopening the window.- The find-next-misspelling cores were extracted into
SpellScan/TextBoxSpellSource/RichTextBoxSpellSource; both the dialog session and the inline Ctrl+F7 navigation run on the same implementation. Scans useGetNextSpellingErrorCharacterIndex/GetNextSpellingErrorPosition— one spell-engine call per error rather than one per character. - The Spelling dialog is modeless (
Show(), owner = compose window) per the project's Modal Dialog Rules; the session re-queries the live editor for each next error, so editing the message mid-check is safe. - Session state (ignore set, change-all map, counters, announcements) lives in
SpellCheckDialogViewModel, unit-tested against scripted sources.
QuickMail v0.7.8.1
QuickMail v0.7.8.1 Release Notes
Download
Two options are available for v0.7.8.1:
| Download | When to use |
|---|---|
quickmail-v0.7.8.1-setup.exe — Windows installer |
Recommended for most users. Installs per-user with no elevation required, checks for the WebView2 Runtime, and registers an uninstaller. |
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.
Bug Fixes
-
Attachment keyboard access was completely broken when reading messages. Pressing Tab to move to the attachment list did not set focus on any attachment; pressing Enter did nothing; pressing Shift+F10 opened the message context menu (Reply, Forward, Delete) instead of the attachment menu (Open, Save, Save All). This affected all three message viewing modes — reading pane, tab, and standalone window. All three interactions now work correctly in all modes.
-
First Shift+F10 in a session showed the Windows system menu. The very first time Shift+F10 was pressed after starting QuickMail, the Windows system menu (Restore, Maximize, Minimize, Close) appeared instead of QuickMail's context menu. All subsequent presses in the same session worked correctly. This has been fixed; QuickMail's context menu now opens consistently from the first keypress.
Thank You to Contributors
Thank you to everyone who has contributed to QuickMail through code, bug reports, feature suggestions, and other feedback. Your contributions make the project better for everyone.
Internal
Attachment list keyboard fixes (issues #162 and #148)
Issue #162 — three root causes fixed:
GotKeyboardFocuson each attachmentListBoxnow calls.Focus()on theListBoxItemcontainer (not justSelectedIndex = 0). SettingSelectedIndexalone selects an item visually but leaves WPF keyboard focus on theListBoxshell. The handler also checkse.OriginalSourceto distinguish focus landing on the shell from a child item already having focus, preventing unwanted resets on subsequent navigation.PreviewKeyDownon each attachmentListBoxnow handles Shift+F10 and the Apps key explicitly, openingContextMenu.IsOpen = truedirectly and markinge.Handled = true. This bypasses WPF's ContextMenu routing mechanism, which was allowingContextMenuOpeningto bubble to the window-level fallback handler and open the message context menu instead.OnWindowContextMenuOpeninginMainWindowgained an exclusion check for the attachment list (IsDescendantOf(ReadingPaneAttachmentList, e.OriginalSource)) as belt-and-suspenders against the same fallback scenario from right-click.
Fixes applied to both MainWindow.xaml.cs (reading pane and tab modes) and MessageWindow.xaml.cs (window mode).
Issue #148 — Win32 hook approach:
A WM_CONTEXTMENU Win32 hook (HwndSource.AddHook) detects when Keyboard.FocusedElement is null at the moment WM_CONTEXTMENU arrives — the state that occurs on the very first Shift+F10 after startup, when WebView2 initialisation has taken Win32 focus without WPF tracking it. The hook calls FocusPanelSynchronously() before returning, giving WPF a non-null focused element to route ContextMenuOpening from. This is a synchronous update; an earlier attempt using Dispatcher.InvokeAsync lost the timing race and did not fix the issue.
Dependency updates
Microsoft.Identity.Client(MSAL) 4.85.0 → 4.85.2Microsoft.NET.Test.Sdk18.6.0 → 18.7.0actions/checkoutv4 → v7peaceiris/actions-gh-pagesv3 → v4
Debug input trace
AccessibilityHelper.RegisterDebugInputTrace(Window) wires window-level PreviewKeyDown and GotKeyboardFocus handlers (both with handledEventsToo: true) when /debug is active. Each key press logs the key, modifiers, handled state, and focused element; each focus change logs the old and new elements labelled by AutomationProperties.Name, XAML x:Name, DataContext type, or element type in that priority order — matching the event-stream style of AccEvent for MSAA. Called from both MainWindow and MessageWindow on load. No-op in normal runs.