The biggest internal requirement that I have for a new mail filter setup is extensibility. The actual decision as to what is and is not spam needs to be left up to modules.
I hesitate to write a system that is a suite of full ACLs, like Exim or Postfix’s access controls. Postfix’s are barely flexible enough to work at all, and Exim’s are so overwhelming and yet limited that you have to be a programmer to write a system that’s not going to break or lose mail, and a clever programmer at that.
Every technique for filtering has a natural place in the flow of things: RBLs are early, at
RCPT TO time; Learning filtering must come after
DATA has been received, and could either stream or receive the message as a single dump. Filtering at
HELO time should be rare: you can’t check a per-destination whitelist that early. You have to wait for
RCPT TO, and in fact, many senders may retry again and again and again if you reject at
HELO instead of
So each plugin receives some part of the SMTP-time data: early ones get IPs and connection-related information, and later ones get the full message data.
Plugins essentially distill their input into a status: “good”, “bad”, “not sure”