Released June 9, 2026 — downloads for this release
Two options are available for v0.7.1:
| Download | When to use |
|---|---|
quickmail-v0.7.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.
The Address Book Contacts tab has been completely redesigned with explicit Add, Edit, and Delete workflows:
Adding a contact: - Press Add or activate the button from the action buttons - Screen reader announces: “Add contact” - Name and Email fields become editable - Type the contact’s name and email address - Press Enter or activate Save to add the contact - The contact is added to the list and fields return to readonly
Editing a contact: - Select a contact from the list
- Press F2, click Edit, or activate
the Edit command (contacts.edit) - Screen reader announces:
“Edit {contact name}” - Name and Email fields become editable - Modify
the contact’s name or email address - Press Enter or activate
Save to save changes - If the email address is already
used by another contact, an error message appears and you can correct it
- On successful save, the contact list updates and fields return to
readonly
Deleting a contact: - Select a contact and press Delete or activate the Delete button - A confirmation dialog asks you to confirm - If confirmed, the contact is deleted from the address book
Reading contact details (keyboard-only access): - Select a contact to populate the Name and Email display fields - Press Tab to focus the Name field (readonly, but fully navigable) - Use arrow keys to move through the text character-by-character (useful for email addresses) - Your screen reader will read the text as you navigate - Press Ctrl+A to select all text; Ctrl+C to copy - Press Tab to move to the Email field or other controls
Name and Email display fields are fully keyboard-navigable even when readonly: - Arrow keys move the cursor character-by-character - Home / End jump to the start or end of the field - Tab / Shift+Tab navigate to the next/previous control - Ctrl+A selects all text - Screen readers can read the content using their standard text access commands
QuickMail now implements robust connection recovery and failure verification to maintain reliable mail sync even on unstable networks:
Startup retry with exponential backoff: - On first launch, QuickMail retries account connections up to 3 times - Delays increase: 15 seconds, then 30 seconds, then 60 seconds - Timeouts also increase per attempt (30s, 45s, 60s) - Automatically handles brief network interruptions without user intervention
Dynamic connection status: - Account connection state is continuously monitored via the IDLE watcher - If the connection drops, the app detects it and updates the UI in real-time - IDLE watcher automatically reconnects with exponential backoff (30s, 60s, 120s cap) - Connection status is reflected in the status bar
Periodic heartbeat: - Every 10 minutes, QuickMail sends a NOOP (no-op) command to keep connections alive - Prevents idle connection timeouts from slow/inactive networks - Detects dropped connections mid-session
Sync visibility in the status bar: - During sync: “Syncing… (X of Y folders)” shows folder-by-folder progress - After sync completes: “Synced HH:MM” shows the last successful sync time - Initial state: “Never synced” until first sync completes - Sync in progress: “In progress” to avoid confusing “Never synced” + “Syncing…” sequence
Account Properties Sync section: - New Sync section shows cache statistics for each account: - Messages in cache: Actual count of synced messages in the local SQLite database - Oldest cached: Date of the earliest message in cache (useful for understanding sync history) - Sync window: “All mail” or “Last N days” (configurable via settings)
False operation error verification: - Empty Trash: After an exception, QuickMail verifies if the trash is actually empty on the server. If the trash count is zero, the operation is considered successful despite the error (TCP acknowledgment timeout). - Delete messages: If deletion fails, the app shows “Delete may not have completed — refreshing” and automatically re-syncs the affected folders after 5 seconds to reconcile the UI with server state.
Error announcements: - All connection, sync, and operation errors are announced through the screen reader announcement system - Users can control which categories of announcements they hear via Settings → Custom Announcements
contacts.add,
contacts.edit, contacts.save,
contacts.cancelEdit).AutomationProperties.LabeledBy so screen
readers announce the label when focusing each field.IsReadOnly="True" binding
prevented cursor navigation entirely. Fields now allow full keyboard
navigation while preventing text modification.Display property
(formatted as “Name contacts.json alongside the authoritative
DisplayName and EmailAddress fields, creating
noise in the file. The property is now marked
[JsonIgnore].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.
Code contributions: - CityDweller — Microsoft Graph backend groundwork: IMailService refactoring, string MessageId migration, backend router and feature gate scaffolding - Menelion — Windows installer (Inno Setup) - serrebidev — Pooled IMAP connections, virtualized folder picker, HTML rendering improvements
Issues and feedback: - CityDweller - Dennisl123 - jaybird110127 - KE8UPE - paoscripts - serrebidev - slannon97 - sofquipeut - taylorarndt
Note: Others have made contributions through various social media platforms that are not listed here yet.
IContactService.UpdateContactAsync(id, displayName, emailAddress)
— new method for updating a contact’s name and email with email-conflict
detection. Returns false if another contact owns the target email
address.AddressBookViewModel — refactored with explicit
BeginAddContactCommand,
BeginEditContactCommand, SaveContactCommand,
and CancelEditCommand. Removed the implicit
“populate-on-select” behavior and replaced it with explicit mode state
(IsEditingContact, EditName,
EditEmail, ContactError).ContactFieldBox_PreviewKeyDown — new keyboard handler
that allows navigation keys (arrows, Tab, Home, End, Ctrl+A) in readonly
mode while blocking all text-modification operations.ContactModel.Display — now marked
[JsonIgnore] to prevent redundant JSON serialization.IMailService.AccountReachabilityChanged — new event
fired when a connection is lost or recovered. Backends (IMAP, Graph)
raise this; MailServiceRouter aggregates and forwards to
the UI layer.IMailService.CountTrashMessagesAsync() — new method for
post-failure trash verification. Used to determine if an Empty Trash
operation succeeded despite an exception.ISyncService.SyncProgressChanged — new event fired
after each folder sync completes with
(completedFolders, totalFolders) for progress
reporting.ILocalStoreService.CountSummariesAsync() and
GetOldestMessageDateAsync() — new methods for cache
statistics in Account Properties. Handle graceful failures in
--online mode.MainViewModel.LastSyncText — new property displays
“Synced HH:MM”, “Never synced”, or “In progress” in the status bar.MainViewModel.StartPeriodicNoOpAsync() — new background
task that sends NOOP commands every 10 minutes to keep connections
alive.ConnectOneAccountAsync() — now implements 3-attempt
startup retry with exponential backoff.StartBackgroundSyncAsync() — updated to subscribe to
reachability events, report sync progress, and wire error
announcements.ImapMailService.RunIdleWatcherAsync() — updated to fire
AccountReachabilityChanged on connection loss/recovery and
implement exponential backoff for reconnection attempts.EmptyTrashAsync() and
DeleteMessagesAsync() — updated with post-failure
verification and reconciliation.StringToVisibilityConverter XAML converter.old@example.com to new@example.com, the old
email entry remains in the address book if it was separate. A future
merge/deduplicate feature will address this.--online flag, there is no cache and no
persistence of sync state, so connection interruptions cannot be
recovered gracefully. Normal mode (with SQLite cache) is recommended for
reliable sync.