Issue Description
Hello,
We run Stalwart Enterprise v0.16.22 (Linux, RocksDB, internal directory, DnsResolver = System). From 2026-10-12 to 2026-10-16 every outbound message to a domain under .aero, .org or .email stayed in the queue or bounced. Each attempt logged:
INFO MX record lookup failed (delivery.mx-lookup-failed) ... domain = "<recipient>.aero",
causedBy = DNS error (mail-auth.dns-error) { details = "DNS error: DNSSEC validation failed" }
It is the same defect as GitHub issue #3316 (closed by the bot so it could be triaged here) and hickory-dns#3963, and it is still present in v0.16.22.
What we confirmed
- The recipient domains are unsigned and their DNS is healthy. BIND’s delv, run on the same host against the same upstream resolvers, returns “unsigned answer” (a correct proof of insecurity) for every affected domain.
- The three TLDs are all mid KSK rollover (2 KSK + 3 ZSK). Their DNSKEY response is about 1,320 bytes, so it is truncated at the 1,232-byte EDNS buffer. .com (371 bytes) and .co.za (751 bytes) were unaffected.
- /etc/resolv.conf lists three nameservers and concurrency was 2, which is the race described in #3316.
- No package, configuration or binary change on our side preceded the failures.
Workaround applied
We set DnsResolver.concurrency = 1 and restarted, because the resolver settings are only read at startup. The next retry delivered within two minutes, and there have been no failures since.
Requests
- Force num_concurrent_reqs = 1 for the DNSSEC resolver in crates/common/src/config/smtp/resolver.rs, as #3316 suggests, so the default System resolver is not exposed.
- In crates/smtp/src/outbound/dane/dnssec.rs, mx_lookup uses the validating resolver whenever dnssec_available is true, even when the TLS strategy has DANE set to Optional. A validation failure on an MX lookup should fall back to the non-validating resolver (with DnssecStatus Indeterminate) unless DANE is Required. One resolver bug should not stop delivery to whole TLDs.
- Make the error say what failed (zone, record type, truncated response). As it stands it points the operator at the recipient’s DNS, which was correct.
- Rebuild the resolver on ReloadSettings, or have the admin UI say a restart is needed.
We can provide redacted log excerpts if useful.
Regards,
Aeroworks Tech Team
Stalwart Version
v0.16.x
Installation Method
Binary (Linux)
Database Backend
RocksDB
Blob Storage
RocksDB
Search Engine
Internal
Directory Backend
Internal
I have reviewed the documentation and FAQ and confirm that my issue is NOT addressed there.
on
I have searched this support forum (open and closed topics) and confirm this is not a duplicate.
on
I understand that topics in this category are triaged by a bot first but a human reply will follow up. If I’d prefer a human-only reply, I’ll add the no-ai tag to my topic.
on