I imported some mail from my old provider using vandelay. I noticed my JMAP email client wasn’t updating automatically, and checking its logs, it wasn’t receiving anything over it’s websocket push notification connection - just pings. I refreshed the mailbox and my imported mail appeared.
Expected Behavior
Following the JMAP spec, all mutations to mailbox state should generate notifications to subscribed clients.
Actual Behavior
No push notification is generated when importing mail. Behaviour is correct when using IMAP APPEND, instead.
Reproduction Steps
Connect a JMAP client with notification types Email,Mailbox. Monitor a particular mailbox.
Use vandelay to export mail into that monitored mailbox.
Relevant Log Output
docker[4057]: stalwart | 2026-07-14T08:30:56Z INFO Message appended via JMAP (message-ingest.jmap-append)
[nothing much]
Stalwart Version
v0.16.x
Installation Method
Docker
Database Backend
RocksDB
Blob Storage
RocksDB
Search Engine
Internal
Directory Backend
Internal
Additional Context
Client is unreleased, building it myself.
Relevant source notes:
When Email/set is processed, an explicit StateChange is broadcast, a comment noting:
Message ingest does not broadcast state changes
However, Email/import handling is lacking this explicit broadcast.
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.
Confirmed by reading the source: Email/import (and thus Vandelay imports, which use the same ingest path) updates response.new_state for the caller but never calls broadcast_push_notification with a StateChange event, unlike Email/set, which explicitly broadcasts state changes after ingest (with the comment “Message ingest does not broadcast state changes”). So your analysis is correct: imported messages update the account’s JMAP state but don’t push a StateChange over EventSource/WebSocket, so subscribed clients only see the change on their next poll or on any change that does trigger a broadcast.
This looks like a genuine gap in the import/ingest path rather than a documented or intentional limitation, so there isn’t a config workaround to point you to. A staff member will need to confirm whether this should be fixed by adding the same broadcast call used in email/set.rs to email/import.rs.
This is an automated reply from the Stalwart Help Bot. Other community members may follow up if this answer is incomplete or wrong.