Sayonara, Baby!
Más sabe el diablo por viejo, que por diablo

Gestionar los correos salientes con sendmail

Podemos ayudar a liberar recursos de nuestro sistema Unix/Linux aplicando una gestión adecuada a la cola de mensajes salientes con sendmail.

Sendmail es uno de los MTAs o Agentes de Transporte de Correo más populares para sistemas Unix, y su misión principal es la de enrutar los mensajes salientes de nuestro sistema para que alcancen su destino. Sin embargo, también proporciona un conjunto de utilidades para el manejo y la gestión de dichos correos.

Los correos pueden acumularse en nuestro sistema sin ser enviados

Supondremos que ya tenemos configurado en nuestro sistema el paquete sendmail y sus paquetes auxiliares. Para más información sobre la instalación y configuración de sendmail podéis consultar estos enlaces:

La cola de correo saliente (outbound queue)

Cuando un correo está listo para su envío normalmente permanece en la cola unos breves instantes hasta que es enrutado hacia el servidor de destino. Sin embargo, en ocasiones un correo puede permanecer en la cola de salida durante un tiempo indefinido sin ser enviado. Esto puede ser debido a que el servidor de destino está inaccesible, o bien porque el correo está mal construído, normalmente por tratarse de spam que se genera en nuestra red. Un mensaje que no puede enviarse inmediatamente vuelve a colocarse en la cola para un posterior reintento durante varias veces, hasta que finalmente sendmail desiste de enviarlo y lo elimina.

El comando mailq es un alias para la orden sendmail -bp y muestra por pantalla información sobre los correos encolados actualmente a la espera de ser enviados. Como se puede ver, cada correo en la cola está identificado por un código de la forma mXXXXXXXXXXXXX donde X es un número o una letra. También se nos muestra el tamaño del mensaje en bytes, la fecha, la hora y el remitente, así como información acerca de los intentos de envío:

Haz clic para ampliar

En el ejemplo vemos que el primer mensaje encolado no tiene especificado ningún remitente y no ha conseguido establecer una conexión smtp con el servidor relay.careeruildermail.com (presumiblemente porque el servicio de correo esté deshabilitado en la máquina y además se trata de un mensaje de spam). El mismo problema de conexión se repite con el segundo correo. El último mensaje no encuentra el host de destino (se ha escrito hotamail en vez de hotmail).

Estos mensajes llevan ya varios días en la cola mientras sendmail intenta repetidamente darles salida, lo que supone un gasto inútil de procesador, memoria, almacenamiento y ancho de banda.

Buscar mensajes atascados en la cola

Los mensajes de correo que se encuentran en espera para ser enviados a otros servidores usualmente se almacenan en la carpeta /var/spool/mqueue/. Por cada mensaje en la cola se encuentran dos ficheros en este directorio de nombres qfmXXXXXXXXXXXXX y dfmXXXXXXXXXXXXX que se corresponden con la cabecera y el cuerpo respectivamente. Para eliminar estos mensajes de la cola basta con eliminar sus ficheros correspondientes de la carpeta mqueue. Es el caso de los mensajes del ejemplo anterior, que como hemos visto pueden ser eliminados con total seguridad.

Sin embargo, si nuestra organización maneja un volúmen muy alto de correos puede resultar tedioso realizar manualmente estas tareas de comprobación y borrado de ficheros. El siguiente script nos permitirá buscar y eliminar automáticamente de la cola los mensajes cuya información proporcionada por mailq presente unas determinadas coincidencias que nosotros consideremos oportunas:

Fichero: colasalida.sh
#!/bin/bash
#
# LIMPIEZA COLA MENSAJES DE SALIDA
#
# Autor:    Carlos Delgado Andrés
# Version:    14/02/2008
#################################################

# Directorio donde se almacenan los mensajes salientes (acabado en "/")
MSGFOLDER="/var/spool/mqueue/"

# Ubicacion del fichero con las coincidencias a eliminar (una palabra por cada linea)
FICHEROCOINCIDENCIAS="/root/colasalida.txt"

# Contador de mensajes a eliminar
CONTADOR=0

# Comprobar los parametros de la llamada al script (puede haber 0 o 1)
if [ $# -gt 1 ]; then
 echo ""
 echo "    SINTAXIS:    $0 [--limpiar]"
 echo ""
 exit 1
fi

if [ $# -eq 1 ];
then
 if [ $1 != "--limpiar" ];
 then
 echo ""
 echo "    SINTAXIS:    $0 [--limpiar]"
 echo ""
 exit 1
 else
 SHOW_ONLY=0
 fi
else
 SHOW_ONLY=1
fi

# Si se usó la opcion --limpiar, se eliminan de la cola los mensajes que contienen las coincidencias:
if [ $SHOW_ONLY -eq 0 ];
then
 echo -e "\n\t** LIMPIANDO COLA OUTBOUND... **\n"

 for id in `mailq | tr '\n' ' ' | sed 's/m[0-9][0-9a-zA-Z]*/\n&/g' | sed '1d' | fgrep -f "${FICHEROCOINCIDENCIAS}" | awk -F' ' '{print $1}'`; do echo -e "\t\t$id"; rm -f "${MSGFOLDER}qf$id"; rm -f "${MSGFOLDER}df$id"; let CONTADOR=$CONTADOR+1; done;

 echo -e "\n\tOK! Eliminado(s) $CONTADOR mensaje(s) de la cola.\n"

# Si no se usó, solo muestra los mensajes que se eliminarian, pero no los elimina
else
 echo -e "\n\t** COINCIDENCIAS EN LA COLA OUTBOUND... **\n"

 # Muestra la info. relativa a los mensajes
 mailq | tr '\n' ' ' | sed 's/m[0-9][0-9a-zA-Z]*/\n&amp;/g' | sed '1d' | fgrep -f "${FICHEROCOINCIDENCIAS}" | sed 's/m[0-9][0-9a-zA-Z]*/\n&amp;/g' | sed 's/:[0-9][0-9] /&amp;\n/g' | sed 's/>[ \t][ \t]*/&amp;\n/g' | sed 's/[ \t][ \t]*</\n</g'

 # Cuenta los mensajes
 for id in `mailq | tr '\n' ' ' | sed 's/m[0-9][0-9a-zA-Z]*/\n&amp;/g' | sed '1d' | fgrep -f "${FICHEROCOINCIDENCIAS}" | awk -F' ' '{print $1}'`; do let CONTADOR=$CONTADOR+1; done;

 echo -e "\n\tPuede(n) eliminarse $CONTADOR mensaje(s) de la cola.\n"
fi

exit 0

El script anterior selecciona en la salida devuelta por mailq los mensajes que cumplen con las coincidencias indicadas en el fichero /root/colasalida.txt, de manera que cada línea presente una de las cadenas a reconocer.

Por ejemplo, si se deseamos buscar todos los mensajes que no presentan remitente o que están dirigidos al dominio hotamail.com, el fichero debería de contener estas dos líneas:

Fichero: colasalida.txt
<>
hotamail

En este caso, vemos que hay dos mensajes en la cola que presentan esas coincidencias:

Haz clic para ampliar

Limpiar la cola de mensajes atascados

Para eliminar todos los mensajes que presentan coincidencias, debemos ejecutar el comando colasalida.sh –limpiar:

Con esto habremos eliminado de un plumazo todos esos correos inútiles que saturaban la cola de correos de nuestra organización.

NOTA:

Es posible que al listar los correos a eliminar, aparezca un carácter junto al identificador de algún mensaje (normalmente un asterisco), lo que indica que actualmente sendmail está trabajando con ese mensaje.

Si se da esta circunstancia, es posible que no sea eliminado de la cola al ejecutar el script con la opción –limpiar. En estos casos, bastaría con esperar unos momentos para volver a ejecutar el script.

About these ads

Una respuesta to “Gestionar los correos salientes con sendmail”

  1. No se lo que quieres filtrar con el comando, en AIX no me funciona

    mailq | tr ‘\n’ ‘ ‘ | sed ‘s/m[0-9][0-9a-zA-Z]*/\n&/g’ | sed ’1d’ | fgrep -f “${FICHEROCOINCIDENCIAS}” | sed ‘s/m[0-9][0-9a-zA-Z]*/\n&/g’ | sed ‘s/:[0-9][0-9] /&\n/g’ | sed ‘s/>[ \t][ \t]*/&\n/g’ | sed ‘s/[ \t][ \t]*</\n</g'


Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

%d personas les gusta esto: