Yes. Try one of the Bayesian math based filters.

If you run your own Linux/Unix server then try bogofilter:

http://bogofilter.sourceforge.net/

If you are reliant on someone else's server the try POPFile, which is written in Perl and operates as a proxy between your client and your POP3 server:

http://sourceforge.net/projects/popfile/

I have not tried POPFile myself, but I am running bogofilter on my production server and it is working well.

All the Bayesian filters work a similar way, they "learn" what your spam and non-spam "look" like and then analyse each incoming message to work out what it is. This means that when you first start using them you have to teach the filter what your spam looks like.

I did this by feeding bogofilter several thousand spam messages and then several thousand non-spam messages.

For the first couple of days of use you have to be very careful to correct any mistakes the filter makes.

With bogofilter I do the following, I have four folders on my IMAP server dedicated to dealing with spam:

"Spam" - stuff I know is really spam
"Maybe spam" - stuff that bogofilter has classified as spam
"Wrong - not spam" - stuff that bogofilter said was spam, but was not
"Wrong - is spam" - stuff that bogofilter said was not spam, but is

In my procmail filters I have a couple of filter that catch stuff I am sure is spam (like mail using funky Chinese/Japanese/Korean character sets) which I send straight to "Spam" and also send to bogofilter telling it that it is definitely spam.

One of the filters looks like this:


:0
* 1^0 ^\/Subject:.*=\?(.*big5|iso-2022-jp|ISO-2022-KR|euc-kr|gb2312|ks_c_5601-1987|windows-1251|windows-1256)\?
* 1^0 ^Content-Type:.*charset="?(.*big5|iso-2022-jp|ISO-2022-KR|euc-kr|gb2312|ks_c_5601-1987|windows-1251|windows-1256)
{
:0wc
| bogofilter -s

:0:
Spam
}



I then have a load of procmail filters for various mailing lists. These lists see almost no spam, so as well as filtering them into a folder for each list I also feed them straight to bogofilter telling it that they are not spam.

They look like this:


:0
* ^From:.*jobserve.com
{
:0wc
| bogofilter -n

:0:
Jobs
}



After that I tell bogofilter have a bash at spotting the spam. At the same time I also have bogofilter add the message to the appropriate database automatically, like this:


:0fwE
| bogofilter -u -e -p

# if bogofilter failed, return the mail to the queue, the MTA will
# retry to deliver it later
# 75 is the value for EX_TEMPFAIL in /usr/include/sysexits.h

:0e
{ EXITCODE=75 HOST }

:0:
* ^X-Bogosity: Yes, tests=bogofilter
"Maybe Spam"



Everything that isn't identified as spam at this point ends up in my inbox.

I check the "Maybe spam" folder once a day, just to make sure that there is no obvious non spam messages. If there are I move them into the "Wrong - is spam" folder. I then select all the messages and dump them into "Spam". I have a script that runs once a day to archive the contents of "Spam".

If I find any spam in my inbox or in one of the mailing lists then I move the message into "Wrong - not spam". I then have a script that runs once an hour that looks in these two folders and tells bogofilter what it did wrong. The script looks like this:


#!/bin/bash

cd $HOME

if [ "Wrong - not spam" -nt "Wrong - not spam.empty" ]; then
echo "Updating Wrong - not spam"
lockfile -r 10 "Wrong - not spam.lock"
if [ "$?" -eq 0 ]; then

mv -f "Wrong - not spam" "Wrong - not spam.tmp"
cp -f "Wrong - not spam.empty" "Wrong - not spam"
touch "Wrong - not spam.empty"
rm -f "Wrong - not spam.lock"
echo `cat "Wrong - not spam.tmp" | /usr/local/bin/mid 14 | bogofilter -vv -N`
rm -f "Wrong - not spam.tmp"

else
echo "Failed to get lockfile for Wrong - not spam."
fi
fi

if [ "Wrong - is spam" -nt "Wrong - is spam.empty" ]; then
echo "Updating Wrong - is spam"
lockfile -r 10 "Wrong - is spam.lock"
if [ "$?" -eq 0 ]; then

mv -f "Wrong - is spam" "Wrong - is spam.tmp"
cp -f "Wrong - is spam.empty" "Wrong - is spam"
touch "Wrong - is spam.empty"
rm -f "Wrong - is spam.lock"
echo `cat "Wrong - is spam.tmp" | /usr/local/bin/mid 14 | bogofilter -vv -S`
rm -f "Wrong - is spam.tmp"

else
echo "Failed to get lockfile for Wrong - is spam."
fi
fi



It only takes me a couple of minutes each day to check that there is nothing vital in "Maybe spam" and to be honest I am getting very few false positives now anyway.

Please forgive my crappy shell script...
_________________________
Remind me to change my signature to something more interesting someday