OK, this is the anti-spam beasty I (mostly) use. It's very feature rich. In fact it has so many layers of spam defense, you will rarely want all of them running.
It is from http://assp.sourceforge.net/
First up, install the Linux version on a Linux box. The windows edition sux0r, manily due to the lack of good perl support, esp for the networking and dns libraries. It does work, but some features are not going to work without putting in a heap of extra time.
Next, you need to decide how paranoid you wish to be.
This will help you choose which aspects of the filtering to have turned on. In particular you need to decide whether you prefer type one or two errors, ie false negatives or false positives.
Pros and cons, in no particular order.
Bayesian Filtering: Unless you're very tolerant of spam, you probably should opt for Bayesian filtering. You can adjust how aggressive it is, so that lets you adjust how much you trust it, so there's no real reason to turn it off. Remember to run in test mode until the bayes check is getting more reliable. I ended up waiting a whole week, and even then got a few false positives. But then I was being quite aggressive with it.
Validate HELOs is really worth using. The messages that this filters are 100% junk. No mail server will ever send you this garbage, and only bad cgi will.
Validate destination address: You may think this is useless, as these won't get delivered anyway. But, if you use the penalty box it is invaluable for catching spam bombers and shoving them into the penalty box incredibly quickly. If you're running a mail server that includes an LDAP service then by far, this is the best (low-maintenance) way to check email addresses.
Missing DNS Info, both PTR and MX checks. These are mostly checking that you would be able to send back to the sending server. Missing MX records means that the sending domain doesn't have an MX, which means nothing specifically points to an email server. Bingo> problem. And missing ptr means the sending PTR doesn't have a reversing entry for a DNS record, theoretically meaning that the IP isn't listed on any DNS. In reality, a lot of domains have flakey DNS entries. SMTP will go to A records if MX records don't exist, so many domains are running happily without an MX and don't know it. And when clusters are used it's possible the sending IP is not DNS listed at all. Not counting DNS services that simply fail to update PTR records with their A records. I log these, but I don't block them. I blocked them for a few hours once and got a heap of false positives. So I don't use them.
Penalty Box: This is one to be careful with. I use it, but with a fairly high threshold that must be reached in fifteen minutes, and I've adjusted most of my weightings down to 1, with the exception of bad addresses. Bad addresses I weight at 20. What this does is essentially penalty box the people who just try lots of different email addresses for a single domain. I hardly get any normal blocks that aren't also "Extreme", because that type of idiot spammer doesn't look at their bounces, and runs heaps of SMTP connections in a short time frame. And the penalty box provides an IP based block, so it happens at the HELO/EHLO stage, before you get to even the email header. But it does need to be used with care.
RBL: This is nifty because it happens at the IP level, like the penalty box. At first, I thought I would end up getting a lot of false positives with this, especially the XBL (exploit block list) and the open relay lists, but in practice, I haven't had any. Blury excellent. If you ask me. Most can be done with the lists from spamhaus.org, but I ended up splitting theirs, then adding ordb.org, and then others, because if it grabs stuff from an open relay, then it can provide more diagnostic info to the real victims.