Released July 21, 2026 — downloads for this release
Two options are available for v0.8.34:
| 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 adds archiving — move messages out of your inbox into an Archive folder instead of deleting them, with a dedicated shortcut — and lets you turn off the delete and archive announcements on their own so they stop interrupting the screen reader as it reads the next message. If you installed QuickMail from the MSI, this update is delivered automatically.
You can now archive a message — move it to your account’s Archive folder — instead of deleting it. This is for mail you want out of your inbox but kept, not thrown away.
When you delete or archive a message, QuickMail announces “Deleting message…” and “1 message deleted.” Because those announcements shared the same setting as background loading and sync progress, turning them off also silenced sync progress — and left on, they can interrupt the screen reader as it starts reading the next message in the list.
Delete and archive announcements now have their own setting. In Settings → Screen Reader Announcements, clear Announce delete and archive actions to silence just that chatter while keeping everything else. It is on by default, and the change takes effect immediately. Failure messages (for example, if a delete may not have completed) are still announced even when this is off.
Thank you, as always, to everyone who contributes to QuickMail through code, bug reports, feature suggestions, and other feedback — including the requests that shaped archiving and the report that the delete announcements were interrupting the reading of the next message.
Found a problem or have a suggestion? There are three ways to reach us — pick the one that fits:
Full details, including exactly what a report contains (and what it never contains), are in the Reporting Issues section of the User Guide.
mail.archive command, titled Move to
Archive (default Ctrl+Shift+M, rebindable, in
the Command Palette). Registered in
MainViewModel.RegisterCommands and overridden in
MainWindow with the same focus-aware guard as
mail.delete so multi-selection in the list and group-tree
nodes archive the whole selection/group via the controls’ own
PreviewKeyDown (an IsArchiveGesture helper).
Ctrl+Shift+M was chosen over Alt+Delete, which collides with the common
screen-reader “announce cursor position” command.MainViewModel.ArchiveMessagesAsync mirrors
DeleteMessagesAsync’s optimistic UI + focus landing, but
the server op is a move (like
MoveSelectedMessagesToFolderAsync): folder counts reconcile
via ScheduleFolderCountRefresh and the account unread total
is left intact (archived mail still belongs to the account). Messages
are grouped by (AccountId, FolderName), so one call on a
From/To/conversation group archives across every account it spans, each
to its own Archive folder. Already-archived messages are skipped;
accounts with no Archive folder surface guidance rather than a silent
no-op.SpecialFolderKind.Archive, detected in
ImapMailService.GetSpecialFolderKind (IMAP
\Archive attribute + name fallback) and
GraphMailService (well-known archive +
display-name fallback); Archive is not excluded from
the All Mail aggregate. New
AccountModel.ArchiveFolderFullName (nullable, auto-persists
to accounts.json), set/cleared from the folder-tree context menu
(Set as Archive Folder / Use Automatic Archive
Folder). No global archive folder.\Archive; pointing an account’s archive
folder at [Gmail]/All Mail archives correctly (the move
removes the Inbox label). Tests: command registration + gesture; Graph
“Archive” maps to SpecialFolderKind.Archive.AnnouncementCategory.Status (every StatusText
change is announced by the View), so they rode the same toggle as
sync/loading and interrupted the screen reader reading the next message.
New AnnouncementCategory.MessageAction +
ConfigModel.AnnounceMessageActions (default on;
config.ini under [global]; honored in
AccessibilityHelper, applied immediately by
ConfigService.Save → AccessibilityHelper.Configure).
Settings dialog: Announce delete and archive
actions.MainViewModel.SetStatus(text, category) sets a one-shot
StatusAnnouncementCategory and assigns
StatusText; the View’s PropertyChanged handler
reads it synchronously (WPF raises PropertyChanged inline)
in QueueStatusAnnounce, capturing the category at queue
time before the VM resets it. Plain StatusText = … stays
Status. Delete/archive progress/success/cancel route
through MessageAction; failures and the archive “no Archive
folder” guidance stay Result so they’re heard even when the
toggle is off. Reusable — move/copy can adopt MessageAction
later.AnnounceMessageActions default-on + config
round-trip; settings-VM load/save round-trip.