Since the dawn of time (even before switching from RedHat to Debian ~6 years ago) I’ve used the Qmail MTA, with a whole pile of other crud piled on top (like vpopmail to handle virtual users, and some Perl to hook up to SpamAssassin and ClamAV).
It worked (in the loosest sense), but had loads of issues.
Most of the parts had to be compiled from source (especially Qmail, since it needed a bundle of patches) and in the early days, not being used to the Way of the Swirl, even ClamnSpam were compiled from sauce. Down the line, that changed, but there was some manual intervention required to make qmail-scanner-queue.pl pick up on changed version numbers. Despite the avalanche of suck inherent to his setup, it worked…so there wasn’t much impetus to break it.
A while back, I played with Exim but never made any real progress making it work and somehow arrived at Postfix, finding guides to do what I wanted (which I’ve since wikified and mangled for my own uses). The current setup uses Postfix MTA, Amavisd with SpamAssassin and ClamAV and Courier for IMAP, with virtual user details stored in a MySQL database and the mail stored under /var/vmail.
Because Postfix can check if a virtual user is valid at SMTP-time it can reject invalidly addressed mail then, whereas the Qmail setup accepted everything then let Vpopmail bin the invalid ones, generating loads of crud to postmaster@domain.
These images should speak for themselves:
There’s just one small annoyance – apparently, there’s no way to get Amavisd-new to include the verbose spam report from SA unless the message is tagged as spam.