Email/import calls (i.e. vandelay export) do not generate push/EventSource notifications

Issue Description

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

  1. Connect a JMAP client with notification types Email,Mailbox. Monitor a particular mailbox.
  2. 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.

on

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.

Fixed in v0.16.14 (not yet released).