Third of the five stacked Administration PRs. This one targets feat/admin-groups (#361). The five are meant to merge together, in order.
What it adds: Mailing lists under Directory, after Groups. A list is its own object in Stalwart, x:MailingList, gated by sysMailingListQuery/sysMailingListGet. Same layout as Accounts and Groups: search, pages of 50, a recipient-count column, and a side panel.
Panel
Display name, address (when creating), recipients and other addresses, all saved together.
Recipients:
Paste several at once: a spreadsheet column, a comma-separated line, or Name <address>. The name words are ignored.
Anything with an @ that isn't an address stays in the box with a warning, so it can be fixed.
A filter appears after 12 recipients.
Save sends only what changed: "recipients/<address>": true | null. Recipients added by someone else while the panel was open are kept. Addresses are compared case-insensitively and escaped per RFC 6901.
Delete: type-the-address confirmation. Recipients' own mail isn't touched.
Stalwart lists have no owners, moderation or posting rules, so the panel doesn't offer any.
Mock:x:MailingList get/query/set with two sample lists, the live recipient-set shape, and refusals for a bad address, an address clash with an account, and a missing permission.
Live: the throwaway-list run on 2026-09-15 (see #361 and KNOWN-ISSUES) confirmed:
create with recipients as a set, and the read-back shape;
adding one recipient with a pointer;
the text filter;
destroy.
Not tried live: removing a recipient with null (the same set patch as group membership, which was confirmed), and the exact wording for an invalid recipient.
Translation: 25 new strings and 1 plural in all nine catalogues (1515/1531 each, 16 falling back as before).
Checked
Typecheck, 1256 web and 215 server tests pass, as do build and i18n:check.
New tests cover:
which recipient changes are sent (only added/removed, case-insensitive, pointer escaping);
paste parsing;
query and create payloads;
mock create/find/pointer/refusals;
panel: saves only changes, keeps unreadable input with a warning, read-only role.
In Chrome against the mock:
Announcements: removed one, pasted Bob Builder <[email protected]>, [email protected]; oops@ (two added, oops@ kept with a warning), saved (count 4→5), reloaded and it was still there;
created "Team" with 2 recipients, then deleted it through the dialog;
Third of the five stacked Administration PRs. This one targets `feat/admin-groups` (#361). The five are meant to merge together, in order.
**What it adds:** Mailing lists under Directory, after Groups. A list is its own object in Stalwart, `x:MailingList`, gated by `sysMailingListQuery`/`sysMailingListGet`. Same layout as Accounts and Groups: search, pages of 50, a recipient-count column, and a side panel.
**Panel**
- Display name, address (when creating), recipients and other addresses, all saved together.
- **Recipients:**
- Paste several at once: a spreadsheet column, a comma-separated line, or `Name <address>`. The name words are ignored.
- Anything with an @ that isn't an address stays in the box with a warning, so it can be fixed.
- A filter appears after 12 recipients.
- Save sends only what changed: `"recipients/<address>": true | null`. Recipients added by someone else while the panel was open are kept. Addresses are compared case-insensitively and escaped per RFC 6901.
- **Delete:** type-the-address confirmation. Recipients' own mail isn't touched.
- Stalwart lists have no owners, moderation or posting rules, so the panel doesn't offer any.
**Mock:** `x:MailingList` get/query/set with two sample lists, the live recipient-set shape, and refusals for a bad address, an address clash with an account, and a missing permission.
**Live:** the throwaway-list run on 2026-09-15 (see #361 and KNOWN-ISSUES) confirmed:
- create with `recipients` as a set, and the read-back shape;
- adding one recipient with a pointer;
- the `text` filter;
- destroy.
Not tried live: removing a recipient with `null` (the same set patch as group membership, which was confirmed), and the exact wording for an invalid recipient.
**Translation:** 25 new strings and 1 plural in all nine catalogues (1515/1531 each, 16 falling back as before).
**Checked**
- Typecheck, 1256 web and 215 server tests pass, as do build and i18n:check.
- New tests cover:
- which recipient changes are sent (only added/removed, case-insensitive, pointer escaping);
- paste parsing;
- query and create payloads;
- mock create/find/pointer/refusals;
- panel: saves only changes, keeps unreadable input with a warning, read-only role.
- In Chrome against the mock:
- Announcements: removed one, pasted `Bob Builder <[email protected]>, [email protected]; oops@` (two added, `oops@` kept with a warning), saved (count 4→5), reloaded and it was still there;
- created "Team" with 2 recipients, then deleted it through the dialog;
- no console errors.
**Merged** 2026-09-15 as coffey-labs/ihasmail@37a0e28871bc
<sub>Rebuilt from: git history, session transcript.</sub>
This repo is archived. You cannot comment on issues.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Third of the five stacked Administration PRs. This one targets
feat/admin-groups(#361). The five are meant to merge together, in order.What it adds: Mailing lists under Directory, after Groups. A list is its own object in Stalwart,
x:MailingList, gated bysysMailingListQuery/sysMailingListGet. Same layout as Accounts and Groups: search, pages of 50, a recipient-count column, and a side panel.Panel
Name <address>. The name words are ignored."recipients/<address>": true | null. Recipients added by someone else while the panel was open are kept. Addresses are compared case-insensitively and escaped per RFC 6901.Mock:
x:MailingListget/query/set with two sample lists, the live recipient-set shape, and refusals for a bad address, an address clash with an account, and a missing permission.Live: the throwaway-list run on 2026-09-15 (see #361 and KNOWN-ISSUES) confirmed:
recipientsas a set, and the read-back shape;textfilter;Not tried live: removing a recipient with
null(the same set patch as group membership, which was confirmed), and the exact wording for an invalid recipient.Translation: 25 new strings and 1 plural in all nine catalogues (1515/1531 each, 16 falling back as before).
Checked
Bob Builder <[email protected]>, [email protected]; oops@(two added,oops@kept with a warning), saved (count 4→5), reloaded and it was still there;Merged 2026-09-15 as coffey-labs/ihasmail@37a0e28871
Rebuilt from: git history, session transcript.