github rustmailer/bichon 2.3.0
Release 2.3.0

3 hours ago

Release Notes

Features

Source-mailbox cleanup for IMAP accounts (#24)
Archived mail can now be moved out of the source mailbox into bichon_auto_created_trash, manually or on a schedule.

  • Move only, never delete: MOVE (RFC 6851) is the only path. Bichon never issues EXPUNGE, and a server without the MOVE capability is reported as unsupported instead of falling back.
  • Every move is preceded by metadata-only verification of both the archived copy and the remote message; the MOVE capability is checked per connection.
  • Scheduled runs drain batches under a 10-minute budget; jobs are listed, polled and cancelled over the API and reattach after a page reload.
  • Reports keep the last 30 runs with per-folder outcomes and the messages that failed, and the new WebUI dialogs ship in 18 locales.

Mailbox browser with reading pane
A per-folder mail browser: browse a mailbox folder by folder and read messages in a pane without leaving the list.

Prometheus metrics (#162)
New /api/v1/metrics endpoint exposing 34 metrics for scraping.

Dashboard storage breakdown
Email data (blob store) and search index size are counted separately,honoured, and storage_stats_available tells API clients when thefigures would be partial.

Sender resolved from configured headers (#386)

  • Accounts can list ordered headers whose first valid mailbox replaces the stored From address at ingest. The real From header remains the fallback, and the original
    address is preserved in wire_from.
  • The display name is stored in from_name; both fields are indexed into from_text / from_text_tri, so sender search, contacts and the dashboard use the resolved
    address.
  • Exposed in account advanced settings (collapsed by default); the web UI renders Name and a via hint.
  • Archive rules still match the real From address; forged headers are

Contact suggestions include display names
/all-contacts now returns { email, name? }, so pickers can show and milter values stay addresses. Mailbox avatars take their initials fromfrom_name.

Gap-fill applies archive rules before downloading
Candidates rejected by header-only filtering are never fetched, and filtered counts surface in state, API and UI. Cancellation finalization, watermark advancement when
every candidate is filtered, and partial-batch accounting are fixed.

Fixes

Message content

  • Attachment parts with Content-Disposition: attachment but no ContenGET /api/v1/message-content with HTTP 500; they fall back toapplication/octet-stream and keep their filename (#369).

Gap-fill and sync

  • Message-ID headers that are folded, lower/upper-case, carry comments, or are not valid UTF-8 are now parsed with the same parser as the archive side, so archived mail
    is no longer treated as missing and re-downloaded as duplicates. Thpath uses the same fix (#368).
  • Archive-rule filtering runs before bodies are fetched; failed header batches no longer shrink a run silently.

Blob store (#393)

  • A short read at a segment tail is treated as a torn write instead of failing the scan.
  • The GC temp segment is removed when prepare or rename fails, stoppi
  • Writes are refused below a 1 GiB free-space floor and trigger a graceful shutdown instead of exiting; draining writes stay allowed.
  • Fixed pread_exact short reads on Windows.

Search

  • Multi-word queries are AND by default; legacy saved searches replayep their OR behaviour.
  • Tag edits rebuild documents losslessly — non-stored text, trigram siblings and re-extracted attachment content from one shared implementation.
  • The analyzer is context-free (no per-string language detection), soion agree.
  • bichon-admin reindex builds the new index root aside, validates it, then swaps by rename: nothing is deleted, unreadable documents go to a 0600 NDJSON report, the
    v1.x migration can run it inline, and index markers self-heal. A cuured.

Docker (#387)

  • tini runs as PID 1, so healthcheck orphans are reaped and SIGTERM ibounded with --max-time 4.

Web UI

  • The search page no longer overflows the viewport.
  • Mailbox view sizing and the folder delete button are fixed; long folder names stay readable.
  • Backup schedule cron expressions are validated before saving.
  • Sidebar sections sit closer together.
  • Cleanup dialogs now scroll correctly with many runs; reports are ordered newest-first with a timeline arrow and a "Latest" marker.

Reliability

  • Stable archive-side IMAP UIDs are assigned once at ingest and carried by every later document reconstruction; a restored backup whose counter is behind the index
    bumps the UIDVALIDITY generation instead of reusing numbers.

Upgrade notes

  • Reindex required. The search index format is now 4 (adds from_name community edition checks each index directory and, when the marker ismissing or older, does not exit: it serves a 503 maintenance page instructing you to run bichon-admin reindex (Docker: docker exec -it bichon-admin
    reindex), then restart. Nothing is deleted — previous indexes are kem.
  • Sender-header override rules apply to new mail immediately; histori the reindex.
  • The Docker image now runs tini as PID 1.

Full Changelog: 2.2.0...2.3.0

Don't miss a new bichon release

NewReleases is sending notifications on new releases.