Troubleshooting & FAQ
The most common failure by far is mail not flowing: the list works in the web UI but nothing gets delivered, or posts go nowhere. Everything below starts from that reality.
“Nothing is being delivered to subscribers”
Work the loop in order.
- Is outbound mail being sent at all? Check the queue and the logs. Try
xlistman queue list— stuck messages show their retry count. If the queue is empty and nothing arrived, outbound was never attempted. - Is
smtp.hostreachable from the xListman host? The queue relays viasmtp.host:smtp.port. Your MTA must accept the relay from this host (for loopback, Postfix’smynetworksmust allow it). - Is
web.base_urlright? It’s the origin in every email — if it’s wrong, links in emails point nowhere. It must start withhttp://orhttps://. - For a first test, use
smtp.mode: sink. Outbound mail becomes files insmtp.sink_dirinstead of being relayed. If those appear, xListman is doing its job and the problem is the MTA, not xListman.
“Posts to the list don’t get in”
The inbound leg is your MTA delivering the list domain to xListman over LMTP (or the pipe socket).
- Did you configure the MTA at all? See MTA integration. The
two-line Postfix wiring, or the exim
manualrouterouter, is what hands mail to xListman. - Is the LMTP server bound somewhere the MTA can reach it? In production
it’s usually
127.0.0.1:8024; make surelmtp.listenmatches what your MTA targets. - Is the daemon running? LMTP and the pipe socket are served by
xlistman serve. No daemon, no inbound mail. - The
mydestinationtrap (Postfix). If the list domain is inmydestination, Postfix applieslocal_recipient_mapsand rejectsdev-subscribe@…as an unknown local user. The domain belongs invirtual_mailbox_domainsonly. - The exim loop guard. exim won’t route to its own SMTP interface
(
127.0.0.1). Use a second loopback address (127.0.0.2) as the LMTP target.
“A subscriber was silently removed / stopped receiving posts”
They probably weren’t removed — they were disabled by the bounce threshold.
Bounced messages are attributed per subscription via VERP; at the list’s bounce_threshold (5 by default) the subscription auto-disables, and the owner
can be notified. Re-enable from /me, by email (re-enable), or by an owner.
Re-enabling resets the bounce count.
“My binary has no web UI”
A plain go build or go install produces a CLI-and-mail binary without the
web UI — the frontend is built and embedded only in Docker images and release
binaries. Use those, or build the web UI first (cd web && pnpm install && pnpm build). See Install.
“I sent a post and got no confirmation / no error”
Posts to a discussion list go out silently when moderation is off. If moderation is on, the post is held and you get a notice. Check the moderation queue and the archive for what actually happened. Unknown commands and rejected posts always produce a reply — silence usually means the message never reached xListman.
“My magic link didn’t arrive, or the page says sign-in is disabled”
- Magic links are rate-limited per address and per IP; too many requests and new ones are refused for the hour.
loginmay be disabled instance-wide —xlistman web statusshows the state, andxlistman enable loginturns it back on (an Administrator action).
“My held message vanished”
Held messages expire after held_expiry_days (14 by default) and are silently
discarded. Same for confirmation and moderation tokens. If a post sat in the
queue longer than that, it’s gone by design.
“The config didn’t load”
xlistman config check will tell you. Unknown keys are rejected, so a typo fails
loudly. web.base_url and database.path are required.
Is it production-ready?
Active, pre-1.0. The 0.x version reflects that the storage and config surface may still evolve — don’t build irreversible automation on it yet. The security policy and contribution path live in the repository.