miércoles, 16 de julio de 2008

Procmail con usuarios virtuales

Debido a un requerimiento de que surgio en mi lugar de trabajo me encontré en la necesidad de hacer filtrado de los correos electrónicos que llegaban a un par de cuentas de correo, lo primero que se me vino a la cabeza fue procmail.

Me pongo a investigar con mi amigo google a ver como podría hacerlo y me encontré con documentación muy pobre que en pocas palabras solo decían

"Cambia la variable mailbox_command por mailbox_command = procmail -a "$EXTENCION"

La cuestión es que si, efectivamente eso funciona bien, pero no sobre la arquitectura en la que tengo montada ese servidor de correo, es decir eso funciona cuando los usuarios son efectivamente usuarios del sistema base donde estan instalador el servidor de correo SMTP (en este caso postfix), pero en este caso los usuarios del servidor heran usuarios virutales los cuales estaban definidos dentro de una base de datos LDAP, ergo no podía hacerlo andar de ninguna forma.

Después de mirar los logs y tratar de entender los que sucedía me dí cuenta que el problema hera que postfix al recibir el correo nunca lo entregaba a procmail sino que hacia la entrega via sus propios mecanismos.

Buscando y buscando encuentro que en el caso de usuarios virtuales en postfix debe especificarse el mecanismo de entrega mediante la definición de la variable virtual_transport en la configuración de postfix (main.cf).

En la variable virtual_transport pueden especificar el mecanismo de entrega (por ejemplo procmail y maildrop) y después definiendo en el master.cf de postfix el formato del comando a ejecutar, por ejemplo en el master.cf deberíamos definir algo como esto

#procmail
procmail unix - n n - - pipe
-o flags=RO user=vmail argv=/usr/bin/procmail -t -m USER=${user} EXTENSION=${extension}
#Maildrop
maildrop unix - n n - - pipe
flags=ODRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}

Bien la cuestión es que googleando tampoco podía encontrar los parámetros especificos para que ese mecanismo funcione adecuadamente, es decir al definir el virtual_transport=procmail puede hacer que intente entregarlo por procmail, pero como los parámetros en el master.cf no heran adecuados tampoco funcionaba y arrojaba el error en los logs.

Por ultimo cai en la última de mis alternativas, defini la variable virtual_transport = local, de esta manera trata a las entregas de los usuarios virtuales normalmente usando la configuración de usuarios reales, de ahí toma la configuración de la variable mailbox_command adecuandamente, por ende al llegar un correo se lo entregaba adecuadamente al procmail. Pero no todo termino allí, procmail estaba mal configurado y dejaba los correos en cualquier lado.

Por defecto procmail entrega los correos en el directorio /var/spool/mail/ en un formato mailbox. La cuestión es que mi servidor estaba configurado con formato de casillas Maildir y los correos se encotraban en el directorio /home/correos/usuario/.

Buscando y buscando como configurar globalmente procmail (mas precisamente sobre el archivo procmailrc) no podía dar en la tecla, mi principal problema fue que no podía cambiar al Maildir correspondiente del usuario. Por gracia divina me tope con un foro donde un muchacho intentaba hacer algo similar y encontró que el nombre del usuario dueño del correo entrante que pretendía ser entregado por el procmail se encontraba en la variable $LOGNAME (y no $USER como vi en otros lados). En sintesis configure el archivo procmailrc (en /etc/) de la siguiente manera

MAILDIR = /home/correo/$LOGNAME/
DEFAULT = /home/correo/$LOGNAME/
LOGFILE = $MAILDIR/proclog
LOCKFILE= $MAILDIR/.lockmail

Después de eso todo funciono de mil maravillas, deje contento a todo el mundo y me puse a crear las recetas para el filtrado (sobre eso hay muuuucha documentación).

Espero que este post sea de ayuda a algún otro individuo que prentenda hacer algo similar.

No hay comentarios: