github postalsys/emailengine v2.86.0

3 hours ago

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)

Don't miss a new emailengine release

NewReleases is sending notifications on new releases.