hMailServer 6.2.17

Built 12 August 2026 6.2 series

This is not the current release. hMailServer 6.3.3 is the one to install unless you need this exact version.

Downloads for 6.2.17

Windows

Windows 10 (version 1607 or later) and Windows 11, or Windows Server 2016 and newer; 64-bit only. Run the installer as an administrator: it upgrades an installation older than this version in place, and it cannot go backwards — an older server refuses a database a newer one has upgraded, so back up the database and the data directory first. It is not Authenticode-signed, so Windows names an unknown publisher and SmartScreen warns before it will run it.

  • hMailServer-6.2.17-x64.exex64 · 71.8 MB
    Download
    SHA-25678da603b3d29…17c182ce

What’s new in 6.2.17

This release identifies and fixes the cause of discussion #18 — mail relayed from Postfix / Proxmox Mail Gateway stalling after 354, with the sender reporting "timed out while sending end of data". That report has been open, unreproduced and honestly labelled as such since 6.2.13. It is now reproduced, understood and bounded.

Full release notes for 6.2.17 5 sections

No database change (schema version 6005).

What was actually happening

Postfix's error means the message body and the terminating dot were fully transmitted, and it was waiting for hMailServer's 250 — which never came. So the stall was never in reception; it was in the accept/save work that runs after end-of-data and before the reply.

Two things combine to produce it

  • For a trusted incoming relay — exactly what a Proxmox/Postfix front end is — hMailServer defers its whole spam battery to after end-of-data. For a direct or authenticated sender those same tests run earlier, during MAIL FROM/RCPT TO, on the connection thread. That is why this only ever happened to relayed mail, and why it never reproduced on a simple test server.
  • That work runs on a bounded pool (15 threads by default) and holds the thread that sends the 250. SpamAssassin's wait had no overall ceiling: the connection's idle timeout is re-armed on every byte received, so a scanner that stalls, or dribbles, holds the thread indefinitely.

Reproduced deliberately, against a SpamAssassin endpoint that accepts connections and never answers:

TestResult
20 concurrent messages, no scannerall acknowledged in 21–40 ms
8 concurrent, virus scanner blackholedall acknowledged in 21–28 ms (virus scanning runs after the 250)
1 message, SpamAssassin blackholedacknowledged after 120 s — slow, but it completes, which is why single-message tests never showed the bug
18 concurrent, SpamAssassin blackholed0 of 18 acknowledged — 15 workers blocked, the rest with no worker at all: total silence, exactly the reported symptom

The fixes

  • SpamAssassin's wait is now bounded. It was an untimed wait released only by an idle timer that any trickle of data re-arms. It now has a hard ceiling (SAMaxTimeout + 30 s) after which the message is accepted without a SpamAssassin verdict — the same outcome as when spamd is simply down. This also required sharing the completion flag properly with the connection, since the old code held a reference to the waiting function's stack.
  • Message acceptance is bounded overall. A new FinalizationTimeout (default 240 s, comfortably inside Postfix's 600 s data-done timeout; 0 disables it) makes the server answer 451 4.3.1 and let the sender retry, rather than leaving it waiting for a reply that will not arrive. The check runs on the accepting thread itself and only before anything is saved, so it cannot duplicate mail — a watchdog replying from outside would race the 250 and deliver the message twice.
  • The silence is now instrumented. Acceptance is timed per stage, and each spam test is timed individually. A slow stage is reported at APPLICATION level rather than only under debug logging, so the log now says:
  • Spam test: SpamTestSpamAssassin, Score: 0, Time: 120031 ms
  • SMTPConnection - accept: done spam-protection in 120047 ms (session 5).
  • Where previously there was nothing at all between 354 and the reply. If acceptance waited on a saturated queue, that is logged too, with the wait in milliseconds.

If you are affected, upgrading is enough to convert silent stalls into either a completed delivery or a clean 451 retry. If you want to know why your server is slow, enable debug logging and the per-stage timings will name the scanner, DNS lookup or event script responsible.

Known related issues, not fixed here

The audit that found this also found other unbounded waits on the same and adjacent paths, deliberately left for a follow-up rather than rushed into this release: synchronous DNS lookups in the spam tests have no application-level timeout, the database connection pool has no acquisition deadline, event scripts have no execution limit, and on the delivery side the ClamAV read/write timeout is currently ineffective. None of these is the reported fault, and each needs its own fix and its own test.

Also in this release

  • The README has been rewritten around what the server does and what it is built on. Per-version change history now lives here on the Releases page, where it belongs.
  • The regression suite gains coverage for clients that vanish mid-operation (aborted DATA, truncated BDAT, IMAP APPEND literals cut short, POP3 disconnects during RETR) — the class of defect that produced the two blockers found during 6.2.15.
  • A new installer smoke test installs each release on a clean throwaway machine and verifies the service registers, starts and listens, so the installer is no longer validated only by the fact that it compiles.

Release facts

Version
6.2.17
Packages
1Windows, x86-64
Database schema
6005upgrades in place
Installer SHA-256
78da603b3d29…17c182cehMailServer-6.2.17-x64.exe

Every file in 6.2.17

Full SHA-256 of each file as recomputed on this server. The SBOM is not needed to install; it lists every component in the build. Nothing in this release is signed — the signing workflow came later — so the hash above is this server’s own recomputation rather than a check against something the project signed.

FileWhat it isSizeSHA-256Signature
hMailServer-6.2.17-x64.exeWindows installer · x6471.8 MB78da603b3d293936fea9758ec9e194909a22f51baa7853c3bbb6a1ae17c182ce
hmailserver.spdx.jsonSBOM (SPDX)Every component in the build, in SPDX JSON.96 KB69e7bd9791ea3febe1e1b0835619b80a0f68cea07230c98ce095e12c39eb8caf
hmailserver.cyclonedx.jsonSBOM (CycloneDX)The same inventory in CycloneDX JSON.50 KB7a703cf4adde4d746fed302c38f50508f6d13d02069fb93b12c2c2bc88e2f766