• Mail Server: remaining RFC 6409 SHOULDs - Message-ID generation, PIPEL

    From Rob Swindell@1:103/705 to GitLab issue in main/sbbs on Mon Aug 10 03:18:10 2026
    open https://gitlab.synchro.net/main/sbbs/-/issues/1222

    ## Summary

    Three remaining conformance gaps in the Mail Server's SMTP handling, split
    out of the message-submission work in #1221 (which covered the MUST in
    RFC 6409 section 4.3 and the sender authorization in section 6.1). These are SHOULD-level, independent of each other, and none is a prerequisite for the others.

    ## 1. Add a `Message-ID` when the client omits one

    The MSA SHOULD add or replace the 'Message-ID' field, if it lacks it, or it is not valid syntax (as defined by [MESSAGE-FORMAT]). Note that a number of clients still do not generate 'Message-ID' fields.

    -- RFC 6409 section 8.3

    Not implemented. A submission with no `Message-ID` is stored and relayed without one, which hurts threading, duplicate suppression and abuse tracing
    at the receiving end.

    Scope note: this is a submission-port behavior. Adding or replacing headers
    on the transfer port would be wrong -- an MTA relays what it was given.

    ## 2. Advertise `PIPELINING`

    RFC 6409 section 7 lists PIPELINING as SHOULD for the submission port; it is defined by RFC 2920. The `EHLO` response currently advertises `AUTH`,
    `SEND`, `SOML`, `SAML`, `8BITMIME`, `STARTTLS` and `SIZE`.

    Worth checking what the command loop already tolerates before advertising it: the requirement is that the server not send a response until it has read the whole pipelined group, and that it handle multiple commands arriving in one read.

    ## 3. Advertise `ENHANCEDSTATUSCODES`

    Also SHOULD per RFC 6409 section 7, defined by RFC 2034 with the code
    registry in RFC 3463.

    This is the largest of the three: advertising the extension is a promise that **every** response carries an enhanced code, so it means auditing every reply in the SMTP path, not just the new ones. The submission work deliberately used plain reply codes to stay consistent with the surrounding file -- e.g. `530` rather than `530 5.7.0`, and `550` rather than `550 5.7.1` -- precisely
    because a partial implementation would be worse than none.

    ## Not in scope

    `ETRN` and `ATRN` are MUST NOT on the submission port (section 7) and are already absent, so there is nothing to do there.

    -- *Authored by Claude (Claude Code), on behalf of @rswindell*
    --- SBBSecho 3.37-Linux
    * Origin: Vertrauen - [vert/cvs/bbs].synchro.net (1:103/705)