2.86.0 (2026-10-22)
Features
- make the failed-job retention, token log and thread collapse limits settings (6d297cf)
- per-account outbox endpoints and account and state filters on GET /v1/outbox (9536c3d)
- REST endpoints for failed webhook deliveries (3dfd5cf)
- REST endpoints for the admin UI actions that had none (7a0bc67)
- webhooksDeliveryAttempts and webhooksRetryDelay settings for the webhook retry policy (4e54e99)
Bug Fixes
- accept a duration for EENGINE_GMAIL_FALLBACK_POLL_INTERVAL (431be3a)
- announce that the pre-2.79 token endpoints and legacy SMTP options go after 2027-01-01 (1a81df4)
- announce the removal of the leftover deprecated request fields and the bull-board redirects (531c411)
- answer every API 404 with code NotFound (ff9c5c9)
- bump bullmq to 6.4.0 (e687a87)
- clean failed queue jobs by EENGINE_QUEUE_KEEP_FAILED_AGE instead of a fixed week (3a404a5)
- clean failed queue jobs by the failed-job retention setting (95fc040)
- close the IMAP command connection within the IDLE restart interval (a659c26)
- count each queue's failed jobs in the same read and the three queues at once for /metrics (7c47e8d)
- cut per-account and per-message Redis round trips on the sync paths (7e2cefe)
- declare Node 20.19.0 in engines and warn at startup on an older 20.x (95b8d53)
- decode outbound text parts with libmime and leave a part it can not decode untouched (efa6406)
- derive account credential keys off the event loop when loading account data (a530179)
- encode custom headers on the raw send path and use nodemailer's own delivery details (d59b382)
- end an IMAP sync pass when ImapFlow finds no mailbox selected, and use its public client API (8521aeb)
- extend the export job lock per message, not per batch of 100 (f22b1d1)
- filter a queue listing by account or route on the job data alone (08300f9)
- give the Docker image a health check and keep its application tree read-only (0c0b70d)
- index a full sync's changed messages a chunk at a time and drop deleted ones in the same round trip (8b49c09)
- keep retrying account assignment after the quick retries at startup (de1c8d6)
- learn the IDLE restart interval of a server that drops idle sessions (19c3844)
- let EENGINE_REDIS_PREFIX and the other lib/consts.js variables be read from a file (de9ba70)
- let POST /v1/settings clear the overridable settings, and parse their values in one place (7bcd190)
- list the GET /v1/settings include flags as chips again in the API reference (7b5c122)
- make account flush and delete complete on Gmail API and MS Graph accounts (7484bdc)
- MCP tools for the new endpoints, server signatures and raw message source (aeb1ae5)
- name every OpenAPI schema deliberately and describe the terse operations (4e7bddc)
- parse envelope recipients and header addresses with mailparser (378b003)
- queue a message through outbox.enqueue() and read its queue settings in one round trip (54c66d4)
- queue export messages a page at a time and write export progress once per batch (d22d9f0)
- queue new messages of an IMAP fast sync in one transaction instead of two round trips each (ed8cc3f)
- read only the jobs of the page shown when listing one account's outbox (2ffbcfe)
- read only what the category lookup, webhook clears and account teardown need (6c3d081)
- read the IMAP message index once per chunk in a full sync and stop deleting the wrong entries (34ca00b)
- refresh an open IMAP folder before searching it and share waiting sync passes (2e5c436)
- refresh the public suffix list (c72b1e1)
- refresh the public suffix list (eed6753)
- report export queue depth, failed jobs, API latency and per-thread heap in /metrics (269876c)
- report missing IMAP workers from /health and add liveness and readiness endpoints (f30f561)
- resolve a sent message's tracking flags in one place (1873f3c)
- resolve Gmail categories over IMAP for a whole pass of new messages at once (710fc6b)
- restore the newer public suffix list, and never replace it with an older download (3f2399a)
- resume IDLE after an upload only once the connection is free (1276c48)
- search webhook routes by their target URL without its credentials (c155541)
- send an API call's latency with its counter instead of a second message per request (2822fe2)
- show why a first TLS certificate order failed instead of a guessed reason (43bbdf5)
- skip messages deleted mid-listing on Gmail and stop leaking outbox content and download streams (048b7d6)
- stop a full Redis from turning into a worker restart loop (936b937)
- switch SMTP server authentication per session instead of for every open connection (2a7c9de)
- the Gmail watch check reads the stored field through the account's own decoding (5cbb53d)
- the learned IDLE interval holds on hosts with several accounts and no longer reads its own side effects as a session cap (808dd58)
- update dependencies (e2adc4f)
- update dotenv to 18.0.9 (ba55217)
- update ImapFlow to 2.6.0, nodemailer to 10.2.0, mailparser to 3.11.0 and the other libraries we own (a98b458)
- update ImapFlow to 2.7.0 and ioredfour to 2.2.0 (6bed980)
- update ImapFlow to 2.8.0 and mailparser to 3.12.0 (18023a1)
- update ImapFlow to 2.9.0 (1ec9a62)
- update mailparser to 3.12.2 (55cc131)
- write a full sync's new and deleted messages a chunk at a time, and share the new-message enrichment (bd60313)