MailFlow v3.1.0
A reliability release focused on IMAP connection handling for people running many accounts on one mail server, plus a fix for duplicate messages in the list.
Fixes
-
Message list no longer shows duplicate copies of the same email (#378). When a message was re-synced (e.g. moved folders or its UID changed), its internal row id was regenerated, and the list could end up showing the same email twice — clicking one highlighted both. The list now identifies rows by their stable Message-ID instead of the volatile row id, so a re-synced message replaces its old entry rather than appearing as a duplicate. Thanks to @brmiller for the detailed report that pinned it down.
-
Snippet indexer no longer gets stuck in an endless backoff loop on connection-limited servers (#379). With several accounts on one mail server, MailFlow's background jobs could collectively exceed the server's per-user/per-IP connection limit, leaving the snippet indexer perpetually refused and retrying without ever draining its backlog. Backfill and snippet indexing now share a single per-host background-connection budget, and connection-refusal backoff is applied per host (so all accounts on a saturated server back off together) instead of thrashing account-by-account.
New
- Optional per-host persistent-connection limit —
IMAP_MAX_PERSISTENT_PER_HOST(#379). For setups with many accounts on one mail server that caps simultaneous IMAP connections. Each account normally holds one always-on IDLE connection, so N accounts on one host means N connections — which can blow the server's limit (Dovecot defaults to 10 per user/IP). When you set this cap, MailFlow keeps that many accounts on live push and quietly polls the rest on the sync interval instead, staying under the provider's limit — the way desktop clients demote secondary accounts. Default is unlimited, so behavior is unchanged unless you opt in.
Upgrade notes
- GHCR / image users: pull
3.1.0(also tagged3.1andlatest). - Source / build-from-source users: pull
mainand rebuild; the version will report as3.1.0. - New setting (optional):
IMAP_MAX_PERSISTENT_PER_HOST— empty or0= unlimited (default, unchanged). Only set it to your provider's connection limit if you run many accounts on one connection-limited server. It's wired into.env.exampleand both compose files.