11.4. Agente de entrega de correo

Red Hat Enterprise Linux incluye dos MDAs principales, Procmail y mail. Ambas aplicaciones son consideradas Agentes de entrega local (LDAs) y ambas mueven el correo desde el archivo spool MTA en el buzón de correo del usuario. Sin embargo, Procmail proporciona un sistema de filtrado de correo robusto.

Esta sección detalla solamente Procmail. Para información sobre el comando mail, consulte su página man.

Procmail entrega y filtra correo mientras es colocado en el archivo spool de correo de la máquina local. Es una herramienta eficaz, que hace un uso adecuado de los recursos del sistema y de amplio uso. Procmail desempeña un papel crítico en la entrega de correo a ser leído por las aplicaciones clientes de correo.

Procmail se puede invocar de muchas formas diferentes. Cada vez que un MTA coloca un correo en el archivo spool de correo, Procmail es lanzado. Procmail luego filtra y archiva el correo para el MUA y sale. Alternativamente, el MUA puede ser configurado para ejecutar Procmail cada vez que se recibe un mensaje y así los mensajes son movidos en sus buzones correctos. Por defecto, la presencia de un archivo /etc/procmailrc o .procmailrc (también llamado archivo rc) en el directorio principal del usuario llamará a Procmail cada vez que un MTA reciba un nuevo mensaje.

Las acciones que toma Procmail con un correo dependen de si el mensaje coincide con un grupo de condiciones o de recetas particulares en el archivo rc. Si un mensaje coincide con la receta o regla, entonces el correo se ubicará en un determinado archivo, se eliminará o se procesará.

Cuando Procmail arranca, lee el mensaje de correo y separa el cuerpo de la información de cabecera. A continuación, busca los archivos /etc/procmailrc y rc en el directorio por defecto /etc/procmailrcs, de todo el sistema, así como las variables de entorno Procmail y reglas. Luego busca si hay un archivo .procmailrc en el directorio principal del usuario. Muchos usuarios también crean archivos rc adicionales para Procmail a los que se hace referencia dentro de .procmailrc en su directorio principal.

Por defecto, no hay archivos rc aplicables a todo el sistema en el directorio /etc/ y ningún archivo de .procmailrc existe en ningún directorio de usuarios. Por lo tanto, para comenzar a usar Procmail, cada usuario debe construir un archivo .procmailrc con variables de entorno y reglas particulares.

11.4.1. Configuración de Procmail

El archivo de configuración de Procmail contienen variables de entorno importantes. Estas variables especifican cosas tales como, qué mensajes deben ordenarse, qué hacer con los mensajes que no coinciden con ninguna receta, etc.

Estas variables de entorno normalmente aparecen al principio del archivo .procmailrc con el siguiente formato:

<env-variable>="<value>"

En este ejemplo, <env-variable> es el nombre de la variable y <value> define la variable.

La mayor parte de los usuarios de Procmail no utilizan muchas variables de entorno y muchas de las variables de entorno más importantes ya están definidas con un valor por defecto. La mayoría de las veces tratará con las siguientes variables:

Otras variables de entorno importantes se extraen del shell, tal como LOGNAME, que es el nombre de conexión, HOME, que es la ubicación del directorio principal y SHELL, que es el shell por defecto.

Hay una explicación completa de todas las variables de entorno y sus valores por defecto en la página man de procmailrc.

11.4.2. Recetas de Procmail

Los usuarios nuevos consideran que la creación de recetas es la parte más difícil de Procmail. En cierto modo, esto es lógico, ya que las recetas comparan los mensajes con las expresiones regulares, que es un formato concreto que se utiliza para especificar cualificaciones para una cadena coincidente. Sin embargo, las expresiones regulares no son difíciles de crear, e incluso es más fácil entenderlas cuando se leen. Además, la consistencia en la forma en que las recetas de Procmail están escritas, independientemente de las expresiones regulares, facilita aprender a través de ejemplos. Para ver ejemplos de recetas, consulte Sección 11.4.2.5.

Una receta de Procmail tiene la siguiente estructura:

:0<flags>: <lockfile-name>

* <special-condition-character> <condition-1>
* <special-condition-character> <condition-2>
* <special-condition-character> <condition-N>

<special-action-character><action-to-perform>

Los dos primeros caracteres de una receta de Procmail son dos puntos y un cero. Opcionalmente, se pueden insertar varios indicadores después del cero para controlar cómo Procmail procesa la receta. Dos puntos después de la sección <flags> especifica que se creará un lockfile para este mensaje. Si se crea un lockfile, debe especificar su nombre en el espacio <lockfile-name>.

Una receta puede contener varias condiciones con las que se comparará el mensaje. Si no tiene condiciones, cada mensaje coincide la receta. Las expresiones regulares se insertan en algunas condiciones para facilitar su comparación con un mensaje. Si se usan varias condiciones, todas ellas deben coincidir para que se realice una acción. Las condiciones se comprueban en función de los indicadores establecidos en la primera línea de la receta. El uso de caracteres especiales opcionales que se insertan después del carácter * permiten controlar todavía más la condición.

La opción <action-to-perform> especifica lo que le ocurrirá a un mensaje si coincide con una de las condiciones. Sólo puede haber una acción por receta. En muchos casos, se usa aquí el nombre de un buzón para dirigir los mensajes coincidentes a ese archivo con el fin de ordenar de una manera eficaz el correo. También se pueden usar caracteres de acción especiales antes de especificar la acción. Consulte la Sección 11.4.2.4 para más información.

11.4.2.1. Recetas de entrega vs. recetas de no entrega

La acción usada si la receta coincide con un mensaje concreto determina si la receta se considera de entrega o de no entrega. Una receta de entrega contiene una acción que registra el mensaje a un archivo, envía el mensaje a otro programa o reenvía el mensaje a otra dirección de correo. Una receta de no entrega cubre cualquier otra acción, como el uso de un bloque de anidamiento. Un bloque de anidamiento es un conjunto de acciones entre llaves { }, que designa las acciones adicionales que deben realizarse en los mensajes que cumplen las condiciones de la receta. Los bloques de anidamiento pueden ser anidados uno entre otro, lo cual proporciona un mayor control a la hora de identificar y realizar acciones en los mensajes.

Cuando los mensajes coinciden con una receta de entrega, Procmail lleva a cabo la acción especificada y deja de comparar el mensaje con otras recetas. Los mensajes que coinciden con recetas de no entrega siguen siendo comparados contra otras recetas.

11.4.2.2. Indicadores

Los indicadores son muy importantes para determinar cómo o si se compararán las condiciones de una receta con un mensaje. Los siguientes indicadores son de uso común:

  • A — Especifica que esta receta sólo se usará si la receta anterior sin un indicador A o a también coincidió con este mensaje.

  • a — Especifica que esta receta sólo se usará si la receta anterior con un indicador A o a también coincidió con este mensaje y se completó exitosamente.

  • B — Analiza el cuerpo del mensaje y busca condiciones coincidentes.

  • b — Utiliza el cuerpo en cualquier acción resultante, como escribir el mensaje a un archivo o reenviarlo. Este es el comportamiento por defecto.

  • c — Genera una copia al carbón (CC) del correo. Es útil para la entrega de recetas, puesto que la acción necesaria se puede realizar en el mensaje y se puede seguir procesando una copia del mensaje en los archivos rc.

  • D — Hace una comparación egrep que distingue entre mayúsculas y minúsculas. Por defecto, el proceso de comparación no distingue entre mayúsculas y minúsculas.

  • E — Similar al indicador A, con la diferencia de que las condiciones de la receta sólo se comparan con el mensaje si la receta inmediatamente anterior sin un indicador E no coincide. Se puede comparar con la acción else.

  • e — Solamente se compara la receta con el mensaje si la acción especificada en la receta inmediatamente anterior falla.

  • f — Usa la canalización (pipes) como filtro.

  • H — Analiza la cabecera del mensaje y busca condiciones coincidentes. Este es el comportamiento por defecto.

  • h — Usa la cabecera en la acción resultante. Este es el comportamiento por defecto.

  • w — Indica a Procmail que debe esperar a que finalice el proceso del filtro o programa especificado, y que cree un informe indicando si tuvo éxito o no antes de considerar el mensaje como filtrado.

  • W — Esto es idéntico a w excepto que se eliminan los mensajes "Program failure".

Para una lista detallada de los indicadores asicionales, consulte la página man de procmailrc.

11.4.2.3. Especificación de un Lockfile local

Los archivos lockfiles son muy útiles en Procmail para garantizar que no más de un proceso intenta alterar un mensaje concreto al mismo tiempo. Puede especificar un lockfile local si inserta un carácter de dos puntos (:)después de cualquier indicador en la primera línea de una receta. Con esto se creará un lockfile local basado en el nombre de archivo de destino más cualquier otro valor definido en la variable de entorno global LOCKEXT.

Como alternativa, puede especificar el nombre del lockfile local que se usará con esta receta después del carácter :.

11.4.2.4. Condiciones y acciones especiales

El uso de caracteres especiales antes de las condiciones y acciones de recetas de Procmail cambian el modo en que se interpretan.

Los siguientes caracteres se pueden usar después del carácter * al principio de una línea de condición de receta:

  • ! — En la línea de condición, invierte la condición y ocasiona que sólo se produzca una coincidencia si la condición no coincide con el mensaje.

  • < — Comprueba si el mensaje está por debajo de un número especificado de bytes.

  • > — Comprueba si el mensaje está sobre un número especificado de bytes.

Los siguientes caracteres se utilizan para realizar acciones especiales:

  • ! — En la línea de acción, este carácter le indica a Procmail que reenvie el mensaje a las direcciones de correo especificadas.

  • $ — Hace referencia a una variable establecida anteriormente en el archivo rc. Se usa normalmente para configurar un buzón común que utilizarán varias recetas.

  • | — Inicia un programa especificado para procesar el mensaje.

  • { y } — Crea un bloque de anidamiento que se usa para contener recetas adicionales a aplicar a los mensajes coincidentes.

Si no se utiliza un carácter especial al principio de la línea de acción, Procmail asume que la línea de acción está especificando el buzón en donde registrar el mensaje.

11.4.2.5. Ejemplos de recetas

Procmail es un programa extremadamente flexible. Sin embargo, como resultado de esta flexibilidad, la composición de una receta de Procmail desde cero para alcanzar un objetivo concreto, puede resultar una labor muy complicada para los usuarios nuevos.

La mejor forma de desarrollar habilidades para construir recetas Procmail parte de un buen entendimiento sobre las expresiones regulares combinadas con la revisión de ejemplos construídos por otros. No entra en el ámbito de este capítulo ofrecer una explicación extensa sobre las expresiones regulares. La estructura de las recetas de Procmail es más importante, y hay ejemplos útiles de ellas en varios sitios de Internet (por ejemplo en http://www.iki.fi/era/procmail/links.html). El uso y la adaptación adecuada de las expresiones regulares contenidas en estos ejemplos se puede derivar observando estas recetas de ejemplo. Puede encontrar información básica sobre reglas de expresiones regulares en las páginas man de grep.

Los ejemplos siguientes demuestran la estructura básica de las recetas Procmail y pueden suministrar la base para construcciones más elaboradas.

Una receta básica puede que ni siquiera tenga condiciones, como se demuestra en el siguiente ejemplo:

:0:
new-mail.spool

La primera línea especifica que se cree un lockfile local pero sin indicar un nombre, de modo que Procmail utilice el nombre del archivo de destino y anexa el valor especificado en la variable de ambiente LOCKEXT. No se especifica ninguna condición y, por tanto, cada mensaje coincide con esta receta y se insertará en el archivo de spool denominado new-mail.spool, que se encuentra dentro del directorio especificado por la variable de entorno MAILDIR. Un agente MUA puede a continuación ver los mensajes de este archivo.

Se puede colocar una receta básica como esta, al final de todos los archivos rc para dirigir los mensajes a una ubicación por defecto.

El ejemplo siguiente coincide los mensajes provenientes de una dirección de correo específica y los descarta.

:0
* ^From: spammer@domain.com
/dev/null

Con este ejemplo, cualquier mensaje enviado por spammer@domain.com se mueve inmediatamente al dispositivo /dev/null, eliminándolos.

AtenciónAtención
 

Asegúrese de que una regla funciona adecuadamente antes de mover los mensajes a /dev/null, que supone una eliminación permanente. Si las condiciones de receta "atrapan" inadvertidamente mensajes no destinados correctamente y estos mensajes desaparecen sin dejar rastro, entonces se hace más difícil revisar problemas en la regla.

Una solución mejor es dirigir la acción de la receta a un buzón especial que compruebe de vez en cuando para buscar positivos falsos. Una vez comprobado que no se han coincidido por error los mensajes, puede eliminar el buzón y dirigir la acción para enviar los mensajes a /dev/null.

La receta siguiente atrapa el correo enviado a una lista de correo particular y lo coloca en una carpeta indicada.

:0:
* ^(From|CC|To).*tux-lug
tuxlug

Cualquier mensaje enviado desde la lista de distribución tux-lug@domain.com se colocará automáticamente en el buzón tuxlug para el agente MUA. Tenga en cuenta que la condición de este ejemplo comparará el mensaje si tiene la dirección de correo de la lista de distribución en las líneas Desde, CC, o Para.

Para más detalles consulte los muchos recursos disponibles para Procmail en línea en la Sección 11.6.

11.4.2.6. Filtros de correo basura

Puesto que Procmail es llamado por Sendmail, Postfix y Fetchmail cuando reciben nuevos correos, se puede usar también como una herramienta poderosa para combatir correo basura.

Esto es particularmente cierto cuando Procmail es usado en conjunto con SpamAssassin. Cuando se usan juntos, estas dos aplicaciones pueden identificar rápidamente correo basura y ordenarlos o destruirlos.

SpamAssassin usa análisis de las cabeceras, de texto, listas negras, una base de datos de seguimiento de correo basura y el análisis de correo basura Bayesiano de autoaprendizaje, para identificar y marcar efectivamente el correo basura.

La forma más fácil para que un usuario local use SpamAssassin es colocar la siguiente línea cerca de la parte superior del archivo ~/.procmailrc:

INCLUDERC=/etc/mail/spamassassin/spamassassin-default.rc

El /etc/mail/spamassassin/spamassassin-default.rc contiene una regla simple de Procmail que activa SpamAssassin para todo el correo entrante. Si un correo es identificado como basura, se marca en la cabecera como tal y en el título se coloca:

*****SPAM*****

El cuerpo del mensaje es también marcado al principio con una lista de qué elementos provocaron que fuese considerado basura.

Para archivar correo marcado como basura, se puede usar una regla similar a lo siguiente:

:0 Hw
* ^X-Spam-Status: Yes
spam

Esta regla archiva todo el correo marcado como basura en el buzón de correo llamado spam.

Puesto que SpamAssassin es un script Perl, puede ser necesario en servidores ocupados usar un demonio binario SpamAssassin (spamd) y la aplicación cliente (spamc). Configurar SpamAssassin de esta forma requiere acceso root.

Para arrancar el demonio spamd, escriba el siguiente comando como usuario root:

/sbin/service spamassassin start

Para iniciar el demonio SpamAssassin cuando se inicia el sistema, use una utilidad initscript, tal como la Herramienta de configuración de servicios (system-config-services), para activar el servicio spamassassin. Consulte la Sección 1.4.2 para más información sobre las utilidades initscript.

Para configurar Procmail a usar la aplicación cliente SpamAssassin en vez de un script Perl, coloque la siguiente línea cerca de la parte superior del archivo ~/.procmailrc . Para una configuración global del sistema, colóquela en /etc/procmailrc:

INCLUDERC=/etc/mail/spamassassin/spamassassin-spamc.rc