Como configurar un filtro antispam para que aprenda de los humanos

Existen diversas formas para enseñar a spamassassin, voy a explicar una muy sencilla y eficaz, que se puede implementar facilmente en todos los clientes de correo electrónico y webmail. El requisito es utilizar cuentas imap en vez de POP3.
1.- Creamos una cuenta llamada spam en la raiz donde moveremos todos los mensajes no deseados. Del resto ya se encarga spamassassin.
En el servidor:
Necesitaremos fetchmail en para obtener los mensajes de la carpeta spam de las cuentas imap. Luego le pasamos esos mensajes al comando sa-learn para que aprenda de ellos utilizando reglas bayesianas. Introducimos esto en un fichero crontab y el trabajo está hecho.
Los siguientes comandos debemos ejecutarlos dentro del servidor de correo.

2.- Entramos a nuestra cuenta del servidor.
3.- Creamos un fichero llamado .fetchmailrc dentro de nuestra carpeta de usuario. En la raiz: ej /home/usuario/.fetchmailrc y le metemos la siguiente configuarción:

poll mi.servidor.es protocol IMAP:
user mynombredeusuario with password micontraseña

y le cambiamos los permisos para que solo nosotros podamos leerlo:

chmod 600 .fetchmailrc

4.-El comando que debemos ejecutar es el siguiente:

/usr/local/bin/fetchmail -a -s -n --folder spam \ -m 'usr/bin/sa-learn --spam'

Para que lo haga automáticamente, lo metemos en el archivo de crontab y lo configuramos para que sea ejecutado cada hora.
Yo soy partidario de fcrontab, por lo que para agregarlo simplemtente:

fcrontab -e

Introducimos:

0 * * * * /usr/local/bin/fetchmail -a -s -n --folder spam -m '/usr/bin/sa-learn --spam' > /dev/null

y comprobamos:

fcrontab -l

Si todo es correcto, cada vez que el spamassassin deje pasar un correo que nosotros consideramos basura, lo movemos a la carpeta spam de nuestro cliente de correo electrónico, y no tenemos que volver a preocuparnos, ya que spamassassin lo leerá y aprenderá de el para no volver a cometer el mismo error.

Ahora ya tenemos un buen sistema antispam ejecutándose, pero vamos a mejorarle todavía mas.
Imaginemos que spamassassin nos ha devuelto un falso positivo, y ha introducido dentro de la carpeta spam un mensaje que en realidad no es spam. Ahora debemos enseñarle que ese correo no es spam, para que no lo vuelva a hacer. Y después de esto, el correo debe ser devuelto a la carpeta de entrada con las cabeceras intactas.
Procedimiento:
1.- Creamos las carpetas imap: spam, no-spam, basura desde nuestro cliente de correo elctrónico.
2.- Obtenemos los mensajes de las carpetas imap con fetchmail.
3.- Procesamos los mensajes. Los de la carpeta spam los marcamos como spam y los mandamos a la carpeta basura, y los de la carpeta no-spam les quitamos la marca de spam y nos los volvemos a reenviar. Para mandar el correo a la carpeta basura se puede hacer de dos formas, el primer paso es reenviarnos el correo de nuevo con las nuevas cabeceras en las que está marcado como spam, y posteriormente o bien mediante un filtro sieve en el servidor moverlo a la carpeta spam o si no desde el propio cliente de correo electrónico crear un filtro (si lo soporta el cliente) que lo mueva a la carpeta spam.
4.- Metemos los comandos en la tabla crontab.

Ejemplo:

fetchmail -a -s -n -p IMAP --folder spam -m 'bash -c "/usr/bin/tee >(/usr/bin/sa-learn --spam --single > /dev/null)|/usr/bin/spamc| /usr/lib/dovecot/deliverr $LOGNAME"'
fetchmail -a -s -n -p IMAP --folder no-spam -m 'bash -c "/usr/bin/tee >(/usr/bin/sa-learn --ham --single > /dev/null)|/usr/bin/spamassassin -d|/usr/lib/dovecot/deliver $LOGNAME"'

spamc creará las cabeceras necesarias para marcar el mensaje como spam y spamassassin -d quitará dichas cabeceras.
El comando deliver puede traer complicaciones en sistemas con correo virtual, en estos casos hay que remitirse a la documentación del sistema de entrega de correo instalado. En mi caso Dovecot: http://wiki.dovecot.org/LDA.

Espero poder publicar pronto un tutorial de como instalar en un sistema debian un completo sistema de correo electrónico formado por Postfix + Dovecot + PostgreSQL + Spamassassin.

Un saludo.