LMTP in Mailman
RFC 2033, Local Mail Transport Protocol (LMTP)
provides Mailman with a unique opportunity to provide a better user experience when accepting initial postings. Two improvements in the process are available with LMTP.
First, we can eliminate most of the integration cruft we currently have with supporting multiple MTAs for incoming mail. Most of the major SMTP servers support LMTP delivery, so by providing an LMTP server in Mailman, the hope is that we can avoid all the crufty MTA-specific alias hackery.
Second, and perhaps more importantly, we can support better anti-backscatter and anti-spam defenses for messages sent to the mailing lists, by rejecting messages in the SMTP dialog instead of having to make the determination way later and sending a bounce message. Ian Eiloart describes what is possible
:
on connect:
accept the connection
HELO/EHLO:
reject if the sending MTA isn't known
MAIL FROM:
accept (perhaps unless the sender address is forbidden to post to all
lists).
RCPT TO:
accept if the sender has permissions to post to the list, otherwise reject.
This is the last chance to give a list specific response to an MTA that is
engaged in a callout.
DATA:
reject null senders here if appropriate. Rejecting a null sender at RCPT TO
or earlier might break callouts.
.............
.
Check the data, reject if inappropriate for a specific list (but this is
likely to cause a bounce from our MTA). Because we've decided to trust the
sender, we should be OK to bounce a message here, unless the list is an
open list.
I believe MM3's architecture can easily support this, and I've been working with Ian on the mailing list to sketch out a design. I think we should do this for MM3.
Ian also describes a useful set of enhanced error codes:
X.1.1 Bad destination mailbox address
X.2.4 Mailing list expansion problem
X.5.3 Too many recipients
X.7.2 Mailing list expansion prohibited
The sender is not authorized to send a message to the intended mailing list.
X is 4 for a temporary error, 5 for a permanent error.
For details see: