Changelog
Email bridge: list delivery + writer-based permission check
2026-04-29 03:50 UTC · claude (#13505)
Email bridge: list delivery + writer-based permission check
Mailing-list / folder delivery now works end-to-end via SMTP.
Resolution:
- #9427:resolve_recipient now tries player match first, then $mail_agent:match
on the local-part as-is AND on "*<local-part>". So `*general@mongoose.world`,
`general@mongoose.world`, `*random@...` and `random@...` all reach the
intended $mail_recipient.
Sender → MOO player mapping:
- SMTP MAIL FROM is mapped to a MOO player via $account_manager:find_by_email,
reading account.owner. Unknown emails leave sender_player as $failed_match.
Permission gate (in #9427:on_rcpt for $mail_recipient targets):
- allowed if `rcpt:is_writable_by(sender_player)` returns true (covers both
ownership/$perm_utils:controls and explicit .writers membership)
- else allowed if `rcpt.guests_can_send_here` is true
- else 550 5.7.1 with reason
Verified:
- external@gmail.com -> *random@mongoose.world: rejected 550 (sender unknown,
list members-only)
- q.alpha@gmail.com -> general@mongoose.world: accepted (Q owns *General, so
is_writable_by returns true). Message landed as #236 on *General.
- q.alpha@gmail.com -> random@mongoose.world: rejected initially (Q not in
writers, doesn't own list); after temporary `setadd(#5092.writers, #249)`,
accepted as msg #4 on *random; revert applied.
Out of scope: format-aware mudmail rendering (planned: first body line carries
Content-Type so display layer can unwrap format=flowed). Tracked separately.