Skip to content

Releases

2611.2

Choose a tag to compare

@kipp-ing kipp-ing released this 07 Nov 12:30

Synced from upstream s1t5/mail-archiver 2611.2.


✨ New Features

  • Pluggable Storage for Original Messages - RawMessages:Storage selects where the original .eml is kept: postgres (default, in the database) or filesystem (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__ResponseMode accepts query, fragment or form_post. The default stays form_post; providers that do not support it, such as Synology SSO Server, work with query.

🐛 Bug Fixes

  • OAuth-Only Mode Is Now Enforced Server-Side - With OAuth__DisablePasswordLogin=true the server now rejects every password POST to /Auth/Login instead 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:Password now 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/obj output 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 username claim, which some providers return as the only name-like value. Empty or non-string claims no longer stop the fallback chain.

2611.1

Choose a tag to compare

@kipp-ing kipp-ing released this 06 Nov 13:45

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 .eml through the REST API (GET /emails/{id}/eml) and the MCP server (get_email_eml). With RawMessages:Enabled (off by default) the original message is stored as received and returned byte for byte by GET /emails/{id}/raw and get_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-Hans browser 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 PostgreSQL 22008 error. The import now uses the shared date fallback chain (Date header, then the Received chain, then Resent-Date) instead of MimeKit's raw value, and every SentDate - 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 an X-MailArchiver-Original-From/-To/-Cc/-Bcc header, 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

Choose a tag to compare

@kipp-ing kipp-ing released this 26 Oct 12:17

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 new DashboardStatsCache table.
  • 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_size per 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

Choose a tag to compare

@kipp-ing kipp-ing released this 27 Jul 09:37

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 tools list_accounts, list_folders, search_emails, get_email and get_attachment. See MCP.
  • Calendar/Meeting Invitations - iCalendar (text/calendar) parts from meeting invites are now preserved as .ics attachments 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 Retention log category.
  • SQL Injection Hardening in Email Search - EmailCoreService.SearchEmailsAsync now canonicalizes sortBy/sortOrder centrally (any unknown value falls back to the defaults) and parametrizes LIMIT/OFFSET instead 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 SENTBEFORE implementations.
  • Retention deletes mails with malformed Message-ID headers - Mails with non-standard Message-ID headers (e.g. doubled closing angle bracket <id@host>>) are now correctly matched against the archive by Delete After Days retention, instead of being silently skipped as "not archived".

2607.3

Choose a tag to compare

@kipp-ing kipp-ing released this 16 Jul 08:00

Synced from upstream s1t5/mail-archiver 2607.3.


✨ New Features

  • Read-only REST API (v1) - Optional, off-by-default REST API under /api/v1 for 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

Choose a tag to compare

@kipp-ing kipp-ing released this 13 Jun 14:38
d27e38a

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.

⚠️ Important: Please create a backup before upgrading, as a migration of all existing attachments will be performed. Please note that storage requirements will temporarily increase during the migration process. For more information, see here.