Configura tu agente de procesamiento de correo con procmail en Linux
Imagina poder configurar tu agente de procesamiento de correo electrónico en tu propio ordenador personal para que haga lo que tú quieras que haga. Imagina poder configurar, con una simple edición de archivo, respuestas automáticas, reenvío automático, reproducción de sonidos específicos, filtrado y muchas otras acciones. Ahora imagina qué aplicación puede hacer esto. Y finalmente, imagina qué sistema operativo debes usar para tener estas increíbles características.
![Configura tu agente de procesamiento de correo con procmail en Linux - Video](https://i.ytimg.com/vi/tDQY49ra9JE/hqdefault.jpg)
Si no estás familiarizado con procmail, no sabes lo que te estás perdiendo. Procmail funciona junto con tu Agente de Transporte de Correo (MTA) local como un agente local de entrega de correo y un potente sistema de filtrado. ¿Qué? Bueno, déjame intentar explicarlo una vez más. Linux tiene varios MTAs (sendmail, fetchmail) que salen, consultan tu servidor de correo configurado (o el servidor de correo de tu proveedor de servicios de Internet) y traen tu correo electrónico a tu ordenador. Luego, el MDA (Agente de Entrega de Correo) toma el correo desde donde el MTA lo deja y lo coloca en tu buzón definido por usuario. (Imagina que el Servicio Postal de los Estados Unidos es tu MTA, tu cartero es tu MDA y tu cartero tiene permiso para clasificar tu correo y eliminar toda la basura que no deseas).
Procmail hace lo que hace (entrega tu correo electrónico en tu buzón y filtra lo no deseado) con una flexibilidad asombrosa que podrías pasar el resto de tu vida informática jugando con sus opciones y configuraciones. En este artículo, resaltaremos algunas de las opciones más útiles y te ayudaremos a crear una receta de procmail altamente personalizada y utilizable.
Configurando .procmailrc
Primero que todo, procmail utiliza un archivo de configuración de recursos (rc) llamado .procmailrc que reside tanto en el directorio principal del usuario como en el directorio /etc. Si no hay un archivo .procmailrc en el directorio principal del usuario, la aplicación utilizará el archivo en /etc.
Debes tener cuidado al escribir el archivo global predeterminado porque se ejecutará con privilegios de root.
Creando recetas de procmail
El archivo .procmailrc está compuesto por diversas recetas que realizan todas las acciones que procmail es capaz de lograr. Algunas de estas recetas son simples y otras son complejas. Sin importar la complejidad de la receta, hay elementos comunes en todas las recetas de procmail que describiremos a continuación.
![](https://newsmatic.com.ar/wp-content/uploads/como-crear-una-nueva-tabla-en-sql-server-con-registros-de-una-tabla-existente-150x150.png)
Escritura de recetas de procmail
Procmail tiene dos tipos de recetas: de entrega y de no entrega. Si se encuentra una receta de entrega que coincide, procmail considera que el correo ha sido entregado y no continuará procesando el archivo .procmailrc después de haber ejecutado correctamente esa parte de la receta. Si se encuentra una receta de no entrega que coincide, el procesamiento del archivo .procmailrc continuará después de que se haya ejecutado la línea de acción de esta receta. En otras palabras, una receta de entrega termina la acción de un correo electrónico y una receta de no entrega permite que la acción continúe.
El archivo .procmailrc se escribe en sintaxis de sendmail.cf, por lo que puedes imaginar la variedad de capacidades. En esta sección, te ilustraré algunos de los aspectos sintácticos necesarios para las recetas de procmail.
Expresiones regulares en procmail
Procmail utiliza expresiones regulares estándar. Una expresión regular es un patrón que describe un conjunto de cadenas (una cadena es una secuencia de caracteres) que se construyen de manera similar a las expresiones aritméticas. Las expresiones regulares generalmente consisten en expresiones singulares más pequeñas que se utilizan para crear un todo mediante diversos operadores. Procmail utiliza expresiones regulares para realizar tareas como buscar una cadena en la línea de asunto de un correo electrónico.
Imagina que una de las tareas que deseas implementar es filtrar correos no deseados, es decir, spam. Dentro de un cliente de correo electrónico con interfaz gráfica, puedes incluir palabras clave y frases clave para que los filtros de correo busquen y actúen en consecuencia. Procmail hace esto exactamente mediante el uso de expresiones. Por ejemplo, si recibes spam frecuentemente con el asunto "Gana dinero desde casa", ¿cómo filtras esto para que nunca aparezca en tu bandeja de entrada? Con expresiones regulares, por supuesto. Veamos una pequeña sección de código utilizada para filtrar el asunto "Gana dinero desde casa". La siguiente sección de código es donde procmail busca el asunto (otra parte del código se utiliza para actuar sobre el correo si el asunto coincide):
* ^Subject:.Gana dinero desde casa$
En la sección anterior, usamos varios operadores para formar una expresión regular:
![](https://newsmatic.com.ar/wp-content/uploads/como-ingresar-incrementos-de-tiempo-de-15-minutos-automaticamente-en-excel-150x150.jpg)
- ^ Marca el inicio de una línea.
- . Significa cualquier carácter siguiente.
- $ Indica el final de una línea.
- ? El elemento anterior es opcional y se encontrará a lo sumo una vez.
- * El elemento anterior se encontrará cero o más veces.
- + El elemento anterior se encontrará una o más veces.
Entonces, puedes ver la sección anterior del código como dos expresiones unidas con operadores para formar una frase:
- Subject:
- Gana dinero desde casa
Incluso podrías filtrar cualquier correo con un asunto que contenga cualquiera de las palabras "Gana dinero desde casa" con el siguiente cambio:
* ^Subject:\.Gana|dinero|desde|casa$
Hemos realizado las siguientes adiciones:
- \ Especifica que la condición debe ser exactamente lo que sigue en lugar de cualquier cosa que siga.
- | Puede ser utilizado como el símbolo de tubería estándar de Linux o como un operador de extracción o (como en esto o eso o estos o esto | eso | estos).
También, procmail puede usar lo siguiente:
- ! Reenviar a la dirección de correo electrónico especificada (ten cuidado, porque esto también puede significar invertir la condición, dependiendo de dónde y cómo se use).
- a* Cualquier secuencia de cero o más a.
- a+ Cualquier secuencia de uno o más a.
- a? Cero o uno a.
- [^-a-d] Cualquier carácter que no sea un guion, a, b, c, d o un salto de línea.
- (abc)* La secuencia abc cero o más veces.
Palabras clave y caracteres especiales en procmail
Como la mayoría de las aplicaciones de este tipo, procmail utiliza palabras clave y caracteres especiales para facilitar su uso. Muchas de estas palabras clave y caracteres deberían ser fáciles de captar y utilizar. Algunos ejemplos son:
![](https://newsmatic.com.ar/wp-content/uploads/rim-llega-a-un-acuerdo-tras-las-demandas-en-su-contra-150x150.jpg)
- :0 Inicio de una receta.
- :0: Inicio de una receta que utiliza un archivo de bloqueo (más adelante hablaremos sobre el uso de archivos de bloqueo).
- To Compara lo que está en el campo To: del correo con la condición.
- From Lo mismo que el anterior, pero comparando el campo From:.
- Subject Lo mismo que el anterior, pero comparando el campo Subject:.
- \/ Todo lo que sigue después de este conjunto de caracteres (una barra diagonal inversa seguida de una barra diagonal --no una V mayúscula [V]--) estará contenido en la variable/palabra clave $MATCH. Y ahora se puede utilizar $MATCH para crear un nombre de archivo (o lo que sea).
- ^TO_ Una expresión especial de procmail diseñada para capturar una dirección de correo electrónico (o el inicio de una dirección de correo electrónico) que se encuentra en cualquier campo de destino (To, Cc, Resent-To, etc.).
Por supuesto, hay muchas palabras clave y metacaracteres más involucrados en procmail, pero la lista anterior nos ayudará a comenzar.
La cabecera
Me gusta pensar en la primera sección del archivo .procmailrc como la cabecera. Esta sección del archivo establece la ubicación del buzón del usuario y el archivo de registro, así como los archivos configurados para fines de depuración.
Esta sección de la cabecera contiene (pero no se limita a) las siguientes líneas:
SHELL=/bin/sh
MAILDIR=$HOME/mail
DEFAULT=$MAILDIR/nombre_de_usuario
LOGFILE=$MAILDIR/log
VERBOSE=no
Las entradas principales de la sección de la cabecera son:
- SHELL=/bin/sh Establece tu shell (en este caso, bash) para evitar problemas innecesarios.
- MAILDIR=$HOME/mail Crea el directorio predeterminado donde se almacenará tu correo. Normalmente, (pero no necesariamente), esto es /home/NOMBRE_DE_USUARIO/mail.
- DEFAULT=$MAILDIR/mail Establece la bandeja de entrada predeterminada.
- LOGFILE=$MAILDIR/log Establece la ubicación predeterminada del registro de procmail. Normalmente, se configura dentro del propio directorio procmail.
- ##LOGABSTRACT=all Esto es para fines de depuración. Quita los ## cuando necesites más información para depurar.
- VERBOSE=no Nuevamente, esto es para fines de depuración. Establece esta opción en yes cuando necesites depurar una receta.
Las recetas
Ahora llegamos al meollo del asunto: el principal impulsor de procmail. Las cebollas y las papas (lo siento, soy vegetariano, así que no hay carne aquí), por así decirlo.
Una receta de procmail es exactamente lo que suena: una receta que se cocina y actúa sobre un correo electrónico entrante. Como mencioné antes, hay recetas de entrega y de no entrega, y aquí te ayudaré a entender las recetas de entrega (en diferentes formas). A medida que avanzamos, construiremos una receta muy simple y luego avanzaremos a recetas más avanzadas.
![](https://newsmatic.com.ar/wp-content/uploads/10-formas-sencillas-de-convertir-una-aburrida-tabla-de-palabras-en-un-elemento-de-diseno-imagen-11-150x150.webp)
La primera receta que vamos a analizar es una obvia, espero. Esta receta simplemente recibe un correo electrónico y lo reenvía a otra dirección (eliminando la dirección original de la cuenta receptora). Esto se puede lograr con la siguiente receta (la cual ya hemos mencionado):
:0
! [email protected]
La receta anterior consiste únicamente en una acción (que es redirigir el correo electrónico). Construiremos sobre esta receta agregando una condición que examinará una parte específica del correo electrónico y, si se cumple la condición, actuará sobre ella.
Por ejemplo, supongamos que quieres que todos los correos electrónicos enviados por la dirección de correo electrónico [email protected] se reenvíen a una cuenta personal, [email protected]. Lo primero que debes hacer es verificar si alguno de los correos entrantes coincide con la siguiente condición:
* ^FROM.*[email protected]*
Con la condición anterior en su lugar, solo se reenviarán los correos electrónicos que provengan de la dirección especificada. Por supuesto, al igual que casi todas las aplicaciones y comandos de Linux, esto se puede modificar para adaptarlo a muchas necesidades. Por ejemplo, supongamos que deseas enviar todos los correos electrónicos provenientes de un dominio determinado (usaremos thisdomain.com) a otra dirección. Para hacer esto, modificarías la condición anterior de la siguiente manera:
* ^FROM\/[email protected]*
Esta nueva condición redirigirá cualquier correo electrónico que provenga de thisdomain.com a la dirección de destino configurada. Observa la diferencia entre las dos condiciones: la primera contiene toda la dirección de correo electrónico que deseas redirigir y la segunda contiene solo la @ y el nombre de dominio. Lo crítico dentro de la nueva condición es la adición de \/.+, que indica que la cadena exacta se encontrará una o más veces.
Llevando las recetas más lejos
Entonces, tenemos nuestra receta de redirección básica que redirige todos los correos electrónicos desde una determinada fuente a otra dirección. ¿Cómo podemos mantener una copia para nosotros mismos? Muy simple.
![](https://newsmatic.com.ar/wp-content/uploads/como-obtener-la-suma-de-ventas-de-los-10-mejores-vendedores-en-excel-sin-necesidad-de-ordenar-150x150.jpg)
Para mantener una copia del correo electrónico redirigido, solo necesitas agregar algo a la receta actual de trabajo. La adición puede ser tan simple como escribir otra sección de acción; sin embargo, vamos a hacer que la receta actual sea un poco más estándar y estable.
Recuerda que solo tenemos dos líneas. La primera línea indica que se está comenzando una nueva receta y la segunda es la receta real. El problema con esta receta es que es muy poco específica. No nos gusta eso. Queremos que nuestras recetas sean lo más específicas posible, y podemos lograrlo utilizando las herramientas que ya tenemos.
En lugar de crear una receta que dice (básicamente) "tomar todo el correo entrante (independientemente de la dirección) y enviarlo a X", queremos decir algo más específico como "tomar todo el correo dirigido a X y enviarlo a Y". Este enfoque ciertamente te llevará más lejos en tu recorrido con procmail. Entonces, ¡vamos a implementarlo!
La primera sección de nuestro pseudocódigo, "tomar todo el correo dirigido a X", se puede manejar con la siguiente condición (usando "[email protected]" para la dirección de correo electrónico entrante):
* ^TO.*[email protected]
La condición anterior es bastante completa, pero aún no hemos terminado. Recuerda que tenemos que comenzar esto con los caracteres :0, por lo que nuestra nueva receta, hasta ahora, se ve así:
:0
* ^T0.*[email protected]
Ahora estás un paso más cerca de tener una mejor receta. El siguiente paso es agregar las líneas de acción que enviarán una copia del correo a otra dirección de correo electrónico (vamos a usar "tú@dominio.com") y guardar una copia en el buzón predeterminado local. Lo primero que haremos es crear las dos secciones de acción para esta receta y luego las uniremos.
![](https://newsmatic.com.ar/wp-content/uploads/crear-indice-de-contenidos-en-microsoft-word-con-estilos-personalizados-imagen-3-150x150.webp)
La primera sección es la de reenvío y se ve así:
:0 c
! tú@dominio.com
Lo que será desconocido en la sección anterior es el indicador c en la primera línea. El indicador c le dice a procmail que estamos haciendo una copia del correo electrónico. También posiblemente desconocido (aunque mencionado anteriormente) es el carácter !, que puede tener dos significados diferentes. En una condición, el carácter ! significa invertir la condición (o no). En una línea de acción, el carácter ! significa reenviar a la dirección de correo electrónico especificada.
Antes de añadir la nueva sección, pongamos juntas las piezas de nuestra receta mejorada:
:0
* ^TO.*[email protected]
*{
! tú@dominio.com
:0
un_nombre_de_directorio
}
Ahora tienes una receta digna de construir sobre ella.
El último paso en esta receta es añadir la sección que enviará una copia del correo electrónico a la bandeja de entrada predeterminada. Para hacer esto, sin embargo, debemos saber cómo encerrar ambas nuevas declaraciones de acción dentro de llaves, {}, para que procmail sepa que ambas declaraciones de acción se utilizarán dentro de la misma receta.
![](https://newsmatic.com.ar/wp-content/uploads/como-detener-el-reenvio-de-correo-no-deseado-desde-tu-servidor-exchange-150x150.png)
La sección que vamos a añadir ahora es muy simple:
:0
/ruta/a/directorio/de/correo
Ten en cuenta que, en la sección anterior, utilizarás tu propia bandeja de entrada del usuario (digamos que el nombre de usuario es Haversham). Supongamos que tu bandeja de entrada se encuentra en /home/Haversham/mail/Haversham y está definida en la sección de la cabecera del archivo .procmailrc. Si es así, todo lo que tendrás que escribir en la nueva sección de nuestra receta actual es:
:0
Haversham
Y procmail sabrá que esta es la bandeja de entrada predeterminada local para el usuario actual.
Ahora, juntando las piezas, tenemos una receta completa que se ve así:
:0
* ^TO.*[email protected]
*{
! tú@dominio.com
:0
Haversham
}
Más allá
Agreguemos más a esta receta para que sepamos cuándo llega un nuevo correo y se entrega mediante nuestra receta actual. ¿Cómo? Lo primero que debemos hacer es agregar algunas marcas estándar a la primera línea :0. Utilizaremos las siguientes marcas:
- i Ignorar cualquier error de escritura en esta receta.
- c Generar una copia del correo electrónico.
- h Pasar el encabezado a la tubería, archivo o destino de correo (el predeterminado).
Ahora agregamos una línea de acción a la condición que reproduce el sonido. Esta nueva línea de acción se ve así:
| play ~/ruta/a/archivo/de/sonido
![](https://newsmatic.com.ar/wp-content/uploads/como-hacer-que-un-grafico-de-excel-se-actualice-automaticamente-al-agregar-nuevos-datos-150x150.jpg)
y se inserta justo debajo de la condición.
Nuestra receta más nueva y sabrosa ahora queda así:
:0ich
* ^TO.*[email protected]
| play ~/ruta/a/archivo/de/sonido
*{
! tú@dominio.com
:0
Haversham
}
Absorbiendo correos electrónicos
Aunque técnicamente no es un programa, la receta que vamos a crear ahora trata sobre agregar remitentes de correo no deseado a una lista negra (black.lst). Esta receta compara los encabezados entrantes con el archivo de lista negra y, si se encuentran coincidencias, los envía a /dev/null (eliminando efectivamente el correo).
Esta receta cubre todos los encabezados comunes de remitentes, así como el campo Para: (ya que muchos remitentes de spam utilizan direcciones falsas). Esta receta también es un poco más compleja que lo que hemos usado hasta ahora. Con esta receta, vamos a usar egrep para buscar remitentes en el archivo de lista negra y usar formail para extraer los contenidos del archivo de encabezado.
El primer paso es crear el archivo black.lst, que se colocará en tu directorio de correo predeterminado (~/mail) y simplemente será una lista de direcciones de correo electrónicas sospechosas como estas:
[email protected]
[email protected]
spà[email protected]
Cada vez que se encuentre una de estas direcciones de correo electrónico en el encabezado de un correo electrónico entrante, el correo se enviará al /dev/null y, por lo tanto, se eliminará para siempre.
![](https://newsmatic.com.ar/wp-content/uploads/como-equilibrar-columnas-de-texto-en-microsoft-word-150x150.jpg)
La receta se ve así:
:0
* ? formail -x”From” -x”From:” -x”Sender:” \
-x”Reply-To:” -x”Return-Path:” -x”To:” \
| egrep -is -f black.lst
/dev/null
La receta se desglosa de la siguiente manera:
- :0 Comienzo de la receta (sin usar un archivo de bloqueo).
- ? formail -x”From” -x”From:” -x”Sender:”\
- -x”Reply-To:” -x”Return-Path:” -x”To:”\
- | egrep -is -f black.lst Este código en realidad es una línea. Se interpreta más o menos así: "Los siguientes elementos se encontrarán cero o más veces (pero todos son opcionales). Usa el programa formail para extraer cualquiera de los siguientes: From, From:, Sender:, Reply-To:, Return-Path:, To:, y utiliza la aplicación egrep (ignorando mayúsculas y minúsculas y suprimiendo los mensajes de error) para compararlo con el archivo black.lst."
- /dev/null Envía todas las direcciones (que se encuentren que coinciden con las direcciones en el archivo black.lst) a /dev/null, eliminándolas efectivamente.
La belleza de esta receta es que te permite simplemente agregar nuevas direcciones de spam en un solo archivo para que solo sea necesaria una receta. Esto es mucho más eficiente que crear múltiples recetas para cualquier y todos los remitentes de spam.
Conclusión
En este primer artículo de nuestra serie de procmail, hemos presentado procmail y hemos trabajado con algunas recetas de entrega bastante útiles. Estás bien encaminado para entender el verdadero poder de esta herramienta. La próxima vez que visitemos procmail, manejaremos algunas recetas de no entrega más complicadas e introduciremos y explicaremos los archivos de bloqueo. Después de completar el segundo artículo de nuestra serie de procmail, deberías estar seguro de tus habilidades con procmail. Mientras tanto, ¡cocina algo!
![](https://newsmatic.com.ar/wp-content/uploads/como-cambiar-el-formato-de-numeros-en-un-grafico-de-excel-150x150.jpg)
En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Software, allí encontraras muchos artículos similares a Configura tu agente de procesamiento de correo con procmail en Linux , tenemos lo ultimo en tecnología 2023.
Artículos Relacionados