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.
|