Repository navigation
Releases
Releases · kipp-ing/mail-archiver
2611.2
Synced from upstream s1t5/mail-archiver 2611.2.
✨ New Features
- Pluggable Storage for Original Messages -
RawMessages:Storageselects where the original.emlis kept:postgres(default, in the database) orfilesystem(gzip files next to the archive, metadata and checksum stay in the database). A migration command moves existing messages between the two backends in either direction, verifying every checksum before it touches a copy.
⚙️ Improvements
- EML Export Serves the Stored Original - The Export EML button on the email detail page returns the original message byte for byte when one is stored, instead of always rebuilding it from the archived fields. Emails without an original still export as before, and the filename and response headers say which of the two forms was served. A checksum mismatch aborts the export rather than quietly returning the reconstruction.
- Configurable OIDC Response Mode -
OAuth__ResponseModeacceptsquery,fragmentorform_post. The default staysform_post; providers that do not support it, such as Synology SSO Server, work withquery.
🐛 Bug Fixes
- OAuth-Only Mode Is Now Enforced Server-Side - With
OAuth__DisablePasswordLogin=truethe server now rejects every password POST to/Auth/Logininstead of only hiding the login form. Before this fix a direct POST with a valid local password still signed the user in and bypassed the configured sign-in policy. - Bootstrap Password Always Forces a Change - Signing in with the admin password from
Authentication:Passwordnow forces a password change on every installation, not only on a fresh one. The previous condition also required an empty archive, so existing installations kept a working admin login with the shipped default password. - Build Output No Longer Nests Recursively - The test project's
bin/objoutput was copied into the web app's output directory on every build, nesting one level deeper each time. The output tree grew to tens of gigabytes and made builds and test runs slow or memory-starved. - OIDC Login Failures Show a Readable Message - A missing or unusable claim no longer ends in an HTTP 500. The user is returned to the login page with a localized explanation and the reason is logged at error level.
- OIDC Name Claim Fallback - The display name is now also read from the
usernameclaim, which some providers return as the only name-like value. Empty or non-string claims no longer stop the fallback chain.
2611.1
Synced from upstream s1t5/mail-archiver 2611.1.
✨ New Features
- Mailcow Integration - Connect Mailcow instances and provision dedicated IMAP app passwords for selected mailboxes, including retry and revocation. Thanks to @tilwegener
- Complete Message Download & Original Message Storage - Download any archived email as a complete
.emlthrough the REST API (GET /emails/{id}/eml) and the MCP server (get_email_eml). WithRawMessages:Enabled(off by default) the original message is stored as received and returned byte for byte byGET /emails/{id}/rawandget_email_raw, including its SHA-256 and capture source @kipp-ing - MP4 Attachment Preview - MP4 and M4V attachments can be played in the attachment preview dialog, including seeking. Thanks to @anonimitoraf
- Chinese Language Support - Complete Simplified Chinese translation with automatic
zh/zh-Hansbrowser detection. Thanks to @wolfbolin - Brazilian Portuguese Language Support - Complete Brazilian Portuguese translation, selectable in the language menu. Thanks to @mvldebian
- Japanese Language Support - Complete Japanese translation, selectable in the language menu. Thanks to @ikawa-ohno
🐛 Bug Fixes
- EML Import Failing with "interval out of range" - Importing messages whose
Date:header is malformed or out of range no longer aborts the job with a PostgreSQL22008error. The import now uses the shared date fallback chain (Date header, then theReceivedchain, thenResent-Date) instead of MimeKit's raw value, and everySentDate- written or compared - is restricted to a plausible range of 1970 to 2100. This also fixes duplicate detection against rows an earlier version wrote with a year-1 date. - Leftover Client Secret on Provider Switch - Switching an account to Microsoft Personal (MSA) now drops a stored client secret instead of sending it with every token refresh, e.g. after switching from Microsoft 365 or when falling back to the shared default client ID.
- Export of Emails with Non-Standard Addresses - Emails whose stored sender or recipient is not a valid email address (e.g. an Exchange X.500 DN such as
/O=EXCHANGELABS/.../CN=RECIPIENTS/CN=...) are no longer skipped during EML/MBox export. The original value is preserved in anX-MailArchiver-Original-From/-To/-Cc/-Bccheader, and valid addresses next to it are kept. - Restore Keeps Original Addresses - Restoring to IMAP no longer replaces an unparsable sender or recipient with a placeholder address (
sender@example.com/recipient@example.com); the original value is preserved in a header instead.
2610.1
Synced from upstream s1t5/mail-archiver 2610.1.
✨ New Features
- New Documentation Site - A dedicated documentation site is now available at https://s1t5.github.io/mail-archiver/
- Dashboard Period & Direction Selection - The dashboard charts can be switched between hours, days, months and years over a selectable period
- Incoming/Outgoing Counter Splits - The dashboard counters carry their received and sent parts, and the account card the number of distinct mail domains
⚙️ Improvements
- Encrypted Mail Account Credentials - IMAP passwords, M365 client secrets and MSA OAuth tokens can now be encrypted at rest. See documentation here.
- Pre-computed Dashboard Statistics - A new background service (
DashboardStatsRefreshService) periodically computes the expensive dashboard aggregates (totals, per-account counts, monthly histogram, top senders, database size) into a newDashboardStatsCachetable. - Dashboard Cache Stampede Protection - Concurrent cold dashboard requests no longer each run the full statistics workload; a per-key semaphore makes them share a single computation. Chart selections share the same protection, so several tabs or users landing on the same chart compute it once.
- Faster Account Storage Refresh - The storage refresh now sums
pg_column_sizeper column instead of per row, so it no longer loads the mail bodies from disk. The displayed values are unchanged. - Documentation Link in Footer - A localized link to the documentation site was added to the footer in all supported languages.
2607.4
Synced from upstream s1t5/mail-archiver 2607.4.
✨ New Features
- MCP Server - Optional Model Context Protocol server (Streamable HTTP transport at
/mcp) that can exposes the archived mail to AI agents via the toolslist_accounts,list_folders,search_emails,get_emailandget_attachment. See MCP. - Calendar/Meeting Invitations - iCalendar (
text/calendar) parts from meeting invites are now preserved as.icsattachments and rendered as a readable plain-text summary (start, end, location, organizer, attendees, description). - Acknowledge Sync Failures - New "Acknowledge Failures" button on the Jobs page for completed sync jobs with failed emails. .
⚙️ Improvements
- Retention Deletion Logging - Server-side (IMAP/M365) and local retention deletions are now recorded in the AccessLogs page as a new
Retentionlog category. - SQL Injection Hardening in Email Search -
EmailCoreService.SearchEmailsAsyncnow canonicalizessortBy/sortOrdercentrally (any unknown value falls back to the defaults) and parametrizesLIMIT/OFFSETinstead of interpolating integers.
🐛 Bug Fixes
- Client-Side Date Guard for Email Deletion - The IMAP and M365 retention deletion now re-verifies the message date client-side before deleting from the live mailbox, regardless of the server-side date filter. Protects against IMAP servers with non-compliant
SENTBEFOREimplementations. - Retention deletes mails with malformed Message-ID headers - Mails with non-standard
Message-IDheaders (e.g. doubled closing angle bracket<id@host>>) are now correctly matched against the archive byDelete After Daysretention, instead of being silently skipped as "not archived".
2607.3
Synced from upstream s1t5/mail-archiver 2607.3.
✨ New Features
- Read-only REST API (v1) - Optional, off-by-default REST API under
/api/v1for programmatic access to the archive (reporting, e-discovery, monitoring, AI agents) without exposing mailbox credentials or talking to the mail provider. See documentation here. Thanks to @kipp-ing for the PR!
⚙️ Improvements
- Search Loading Indicator - Search submit button shows a spinner and is disabled while the search request is in flight
- Dashboard Storage Label - Renamed the dashboard storage tile label to "Database size" to clarify it shows the database size, not mailbox storage
🐛 Bug Fixes
- Dark Mode Flash on Page Navigation - Theme is now applied synchronously via a blocking inline script in the
<head>before stylesheets load, eliminating the brief light-mode flash during page transitions - Zero-Grant Access Control - Closed cross-account bypass for users with no mailbox grants in EmailsController and EmailCoreService - M365 Graph Raw Headers - Populate RawHeaders for M365/Graph-synced mail via internetMessageHeaders,
- Dashboard Chart Dark Mode - Charts (monthly bar + top senders doughnut) now adapt text, grid, legend and tooltip colors to the active theme and update live when toggling dark mode
- Dashboard & Export Timezone - Fixed recent-emails timestamps on the dashboard being shifted by the configured display timezone offset (shown as UTC by the JS converter) and single-EML export emitting a wrong
Date:header; both now use the stored display-timezone value consistently with the emails index/details pages
2606.1
Synced from upstream s1t5/mail-archiver 2606.1.
✨ New Features
- Attachment Deduplication to reduce the storage space needed for recurring attachments such as company logos in signatures (see documentation here)
- Added Local File Import Options, see documentation here.
- New Feature Splash Screen to display release notes to administrators after the update (can be disabled in the environment variables if unwanted, see setup documentation).
⚙️ Improvements
- Added information about failed exports (see issue s1t5#430).
🐛 Bug Fixes
- Fixed Header Preservation for bulk export.