Hogar Indice Busqueda Enlaces Sobre Nosotros
  Noticias   Archivos   Compañias   Consejos y Trucos  

Procesamiento de Correo con procmail

por Angel Lopez


Instalación

Funciones Básicas

Configuraciones

Listas de Correo

Respondiendo Correo

Bucles Infinitos

Descifrando Mensajes

Conclusiones

Instalación

El primer paso es conseguir la �ltima versi�n de procmail. Cuando se comenz� a escribir este art�culo la �ltima versi�n disponible era la 3.11pre7.

Una vez que hayas obtenido el fichero con las fuentes del programa, para instalarlo deber�s descomprimirlo con el siguiente comando: tar -xzvf procmail.tar.gz

El siguiente paso ser�a editar los ficheros Makefile y config.h. Al ser este art�culo de introducci�n y para no complicar en exceso este primer acercamiento a procmail, no trataremos las diferentes opciones de configuraci�n de estos ficheros. El lector interesado en ello puede consultar las p�ginas de manual y la documentaci�n suministrada con el paquete.

No obstante, es conveniente resaltar la presencia de la opci�n BASENAME en el fichero Makefile. Con esta opci�n indicaremos el directorio base donde se instalar� procmail. Del directorio que indiquemos en esta opci�n colgar�n otros como bin y man.

Finalmente, para compilar el paquete, deberemos ejecutar el comando make install.

Procmail puede instalarse para todo el sistema y ser llamado desde alguna regla del sendmail(8) o puede ser instalado por un usuario para su uso particular. En �ste �ltimo caso, el usuario indicar� el uso de procmail en su .forward, donde habr� una l�nea como la siguiente:

|IFS=' ' && exec /home/juan/procmail/bin/procmail -f- || exit 75 #juan

He indicado esta l�nea suponiendo que el usuario juan ha instalado procmail en su HOME. Para esta l�nea en particular deberiamos haber indicado como BASENAME el directorio /home/juan/procmail.

Funcionamiento Básico

Procmail lee de su entrada standard un mensaje. Consulta el fichero .procmailrc que es un fichero de configuraci�n que el usuario deber� tener en su HOME. Este fichero define ciertas reglas que servir�n para que el procmail sepa qu� hacer con el mensaje que ha leido.

Se podr� indicar que compruebe la cabecera del mensaje y busque ciertas cadenas en ella, para decidir si queremos guardar el mensaje, descartarlo, contestarlo autom�ticamente, etc...

Procmail nos permitir� tratar el correo que nos llegue, o el almacenado en un fichero, de manera autom�tica.

Configuración

El fichero de configuraci�n usado es .procmailrc y deberemos tenerlo en nuestro HOME.

Toda l�nea que comience por # se considerar� un comentario.

Las l�neas que comiencen por :0 o :0: indicar�n el comienzo de una regla que indicar� a procmail qu� debe hacer con un mensaje.

Las l�neas que comienzan por * indican la condici�n de una regla. De esta manera procmail selecciona la regla que debe aplicar a un mensaje determinado.

Las restantes l�neas, es decir, aquellas que no comienzan por un :, un # o un * se considerar�n comandos, es decir, lo que tiene que hacer procmail al ver que cierto mensaje cumple la condici�n indicada en una regla. Se podr� borrar el mensaje, redirigirselo a otra persona, guardarlo en un fichero...

Lo primero que deber�s indicar en tu .procmailrc son algunas variables de entorno, a continuaci�n te muestro algunas que es recomendable establecer:

MAILDIR
Indica el directorio donde se almacenan los ficheros con los mensajes de correo. Generalmente apuntar� a $HOME/mail o $HOME/Mail. El que sea uno u otro, o incluso otro nombre de directorio depender� del lector de correo que usemos.

LOGFILE
Indica un fichero donde procmail dejar� constancia de todo lo que vaya haciendo.

SENDMAIL
Indica d�nde encontrar el sendmail, que se usar� cuando se conteste autom�ticamente a los mensajes.

FORMAIL
Indica d�nde encontrar el formail. Este programa se distribuye junto al procmail y sirve para modificar las cabeceras de los mensajes o reformatear un mensaje antes de enviarlos o almacenarlos.

DEFAULT
Fichero donde se almacenar� un mensaje si no se le ha podido aplicar ninguna de las reglas definidas.

En cualquier parte de .procmailrc se puede redifinir una variable de entorno. Si se indicase sin el = y un valor, dicha variable se eliminar�a.

Respecto a las reglas, apuntar que podemos clasificarlas en dos tipos: reglas que dan por entregado un mensaje y las que no lo dan por entregado.

Las primeras suponen que el mensaje ya ha sido entregado tras la ejecuci�n de la regla, por lo que no se siguen buscando m�s reglas que pudieran aplicarse al mensaje.

En el segundo caso no se da por entregado el mensaje, as� que al terminar la ejecuci�n de la regla actual se contin�a la b�squeda de otra regla que pudiera ser aplicada.

La sintaxis general de una regla es la siguiente:


           :0 [opciones] [ : [fichero de exclusi�n] ]

           * condicion 1

           * condicion 2

                 .

                 .

                 .

           * condici�n N

           comando

           

Vayamos por partes analizando esta construcci�n. En primer lugar cada regla comienza por un :0, a continuaci�n podemos indicar las siguientes opciones:

H La condici�n se aplica a la cabecera del mensaje.
B La condici�n se busca en el cuerpo del mensaje.
D Al analizar la condici�n se distingue entre may�sculas y min�sculas.
A Esta regla se ejecutar� �nicamente si su antecesora lo hizo.
a Igual que la anterior, con la salvedad de que la ejecuci�n de la regla anterior debi� realizarse sin errores.
E Esta regla se ejecutar� si la anterior no lo hizo.
e Esta regla se ejecutar� si se intento ejecutar la regla anterior pero hubo alg�n error.
h La cabecera se pasa al comando.
b El cuerpo del mensaje se pasa al comando.
f El comando se considerar� como un filtro.
c Genera un carbon copy del mensaje. Al ejecutar una regla que da el mensaje por entregado con este flag, se consigue que el mensaje no se de por entregado y se puedan ejecutar otras reglas a continuaci�n de esta.
w Espera a que el comando se ejecute para recibir su c�digo de salida.
W Igual que el anterior pero en caso de error no emite ning�n mensaje.
i Ignora los posibles errores de escritura.
r Escribe el mensaje tal y como est�. No comprueba que termine en una l�nea en blanco que ser�a lo correcto.

Por defecto, de no indicarse nada, se comparar� la condici�n de la regla con la cabecera del mensaje (opci�n H). Al comando se le pasar� a su entrada est�ndard tanto la cabecera del mensaje como su cuerpo (opciones h y b). No se har� distinci�n entre may�sculas y min�sculas.

Tras el :0 y las posibles opciones puede aparecer opcionalmente un segundo :, de hacerlo se estar� indicando que el fichero destino donde se escriba el mensaje debe bloquearse para que dos procesos no escriban a la vez sobre el fichero. Opcionalmente se puede indicar el fichero de exclusi�n que se usar� para realizar el bloqueo.

A continuaci�n vienen las condiciones, una por l�nea y precedidas por un *. En las condiciones generalmente se usan expresiones regulares para intentar encontrar cadenas de texto dentro de la cabecera o del cuerpo del mensaje. Las expresiones regulares usan los siguientes s�mbolos entre otros:

^ Comienzo de la l�nea.
$ Final de la l�nea.
. Cualquier caracter excepto un salto de l�nea.
* Cero o m�s veces.
+ Una o m�s veces.
? Cero o una vez.
[a-z] Rango de caracteres, en este caso de la 'a' a la 'z'.
[^a-z] Cualquier caracter que no est� en el rango de la 'a' a la 'z'.
a|b La 'a' o la 'b'

Tras las condiciones viene un �nico comando. Si el primer car�cter del comando es alguno de los siguientes se sigue un comportamiento especial:

! Se redirige el mensaje a todas las direcciones de correo que se indiquen.
| Si despu�s del s�mbolo se pone el nombre de un programa, �ste se ejecutar�. Si no se indica nada tras el s�mbolo, el mensaje se sacar� por la salida est�ndard. Si se indica el nombre de una variable de entorno antes del |, entonces el resultado del comando indicado se guarda en esta variable.

Mailing Lists

Una situaci�n en la que procmail puede sernos �til es en la organizaci�n del correo. Supongamos que estamos apuntados a 3 listas de distribuci�n de Linux. Cada lista se identifica por la direcci�n desde la cual nos llegan sus respectivos mensajes, as� pues podr�amos tener las siguientes direcciones:


           [email protected]

           [email protected]

           [email protected]

           

En condiciones normales los mensajes de estas listas nos llegar�an juntos, y de no separarlos los tendr�amos todos mezclados en nuestro fichero de correo. Ser�a mucho m�s c�modo si al llegar se fuesen clasificando y guardando en diferentes ficheros.

Procmail nos puede solucionar este caso de manera sencilla. Podr�amos usar un fichero .procmailrc que tuviese las siguientes reglas para solucionar nuestro ejemplo de las mailing lists de Linux:


:0

* ^From.*[email protected]

l-linux



:0

* ^From.*[email protected]

linux-mx



:0

* ^From.*[email protected]

linux-security

Veamos detenidamente una de las reglas. Si comprendes el funcionamiento de �sta, comprender�s el resto ya que la idea es la misma siempre.

En primer lugar nos encontramos un :0 que nos indica el comienzo de una regla. No aparece ninguna opci�n adicional as� que se toman las opciones por defecto: no se diferencian may�sculas y min�sculas, la condici�n se aplica sobre la cabecera del mensaje, al comando se le pasar� tanto la cabecera del mensaje como su cuerpo.

En la siguiente l�nea encontramos la condici�n, que como ya hemos visto siempre se identifica porque el primer car�cter de la l�nea es un *. La condici�n es la siguiente expresi�n regular:

^From.*[email protected]

El ^From indica que se buscar�n aquellas l�neas que comiencen por From

El .* que sigue, quiere decir cualquier n�mero de caracteres. Ya hemos visto que en expresiones regulares . equivale a cualquier car�cter y * hace referencia a 0 o m�s caracteres. Por tanto con .* indicamos que tras el From inicial pueden venir 0 o m�s caracteres.

A continuaci�n deber� venir [email protected] que es la direcci�n desde la cual provienen los mensajes.

Si piensas un poco en la expresi�n regular, ver�s que lineas como las siguientes ser�an reconocidas:


From: [email protected]

From:[email protected]

FROM [email protected]

Ya podemos distinguir los mensajes que provengan de esta direcci�n del resto. Y ahora que ya tenemos un mensaje, �qu� hacemos con �l?

La siguiente l�nea es el comando, y nos indicar� qu� hacer con el mensaje reconocido. En nuestro caso indicamos un nombre de fichero linux-mx donde queremos que se guarde el mensaje. El nombre de fichero, de no indicarse un camino absoluto, se tomar� como relativo al directorio indicado en la variable de entorno $MAILDIR.

Como ves, de esta manera podemos guardar en diferentes ficheros los mensajes que nos lleguen de diferentes listas de distribuci�n, diferenci�ndolos por su direcci�n de origen (From).

Contestación Automática

Otra situaci�n en la que procmail puede ser de ayuda es en las contestaciones autom�ticas. Puede serte �til, por ejemplo, si quieres mandar autom�ticamente tu llave p�blica de PGP a todas aquellas personas que te lo soliciten por E-Mail.

Para ello, tomamos como regla que cualquier mensaje que tenga la cadena "PGP" en el campo de Subject ser� una petici�n de env�o de nuestra llave p�blica de PGP. La regla podr�a definirse de la siguiente manera:


0:

* ^Subject.*PGP

| (formail -r ; cat $HOME/llave.asc) | sendmail -t

Esta misma idea se puede aplicar para hacer el t�pico programa que avisa a la gente de que nos hemos ido de vacaciones y que por tanto contestaremos su E-Mail a la vuelta:


0:

| (formail -r; cat $HOME/vacaciones.txt) | sendmail -t

En este caso no hay condici�n, ya que se quiere aplicar a todos los mensajes que nos lleguen.

Evitando Bucles en Contestaciones Automáticas

En los ejemplos expuestos no nos hemos preocupado de manejar los posibles bucles que se puedan producir con el correo cuando se realizan contestaciones autom�ticas.

Si nos llegase un mensaje cuyo origen fuese nuestra propia direcci�n de E-Mail, el programa contestar�a a esa direcci�n, lleg�ndonos dicha contestaci�n a nosotros mismos. Este mensaje volver�a a ser contestado, y as� sucesivamente entrando en un bucle infinito. Para evitarlo, cuando contestamos al mensaje a�adimos una nueva l�nea a la cabecera para indicar que ya lo hemos contestado. Esto lo hacemos con la opci�n -A de formail:

formail -r -A"X-Loop: [email protected]"

Donde [email protected] ser�a tu propia direcci�n de E-Mail. De esta manera al crear la cabecera para responder a un mensaje se le a�ade la l�nea X-Loop que comprobaremos luego en nuestras reglas de la siguiente manera:


:0

* !^X-Loop: [email protected]

| (formail -r -A"X-Loop: [email protected]" ; 

    cat $HOME/vacaciones.txt) | sendmail -t

Con esta regla evitamos entrar en un bucle, ya que los mensajes que contengan en la cabecera la l�nea X-Loop no cumplir�an la condici�n y no ser�an contestados.

Decodificando Ficheros

Otra regla interesante para nuestro .procmailrc podr�a ser aquella que decodificase autom�ticamente aquellos mensajes que contengan un fichero codificado con uuencode(1). La regla podr�a ser la siguiente:


:0 B

* ^begin 644 .*

{

	MAILDIR=$HOME/ficheros

	

	:0

	| uudecode

}

En esta regla indicamos expl�citamente con la opci�n B que �nicamente deseamos comprobar la condici�n en el cuerpo del mensaje.

Si encontramos una l�nea que comience con la cadena "begin 644" significa que hemos encontrado el comienzo de un fichero codificado con uuencode(1) as� que establecemos la variable de entorno MAILDIR, que ser�a equivalente a cambiar al directorio indicado en dicha variable, ya que todas las escrituras se realizar�n tomando como directorio base el indicado. En nuestro caso nos interesa guardar los ficheros recibidos por E-Mail en $HOME/ficheros.

A continuaci�n tenemos una regla, sin condici�n, que �nicamente pasa el mensaje al uudecode(1) para que lo decodifique. El fichero original lo obtendremos en $HOME/ficheros.

Conclusión

Como se puede apreciar de la breve introducci�n que se ha realizado a procmail, este programa puede ser realmente vers�til y ayudarnos en la gesti�n del correo de una manera f�cil y c�moda. Recomiendo experimentar con las expresiones regulares y las reglas, para adaptar el programa a tus necesidades, ya que sus posibilidades van mucho m�s all� de lo que se ha expuesto en esta peque�a introducci�n.


Para más información:
  • Consulte la página de manual del procmail
  • Lea otros artículos por el mismo autor:PGP en Linux.


© 1998 Angel Lopez
This website is mantained by Miguel A Sepulveda.