Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Scripts de apoyo a Majordomo

Última Actualización: 22 de Enero de 2.001 - Lunes

Majordomo es un gestor de lista de correo escrito en Perl. Su misión fundamental es gestionar las altas y bajas de usuarios, y encargarse del envío de los mensajes a las listas de correo cuando éstas se han configurado de forma especial (por ejemplo, limitando el tamaño de los mensajes o sólo permitiendo mensajes desde miembros).

Majordomo carece, no obstante, de un sistema de control de "bounces" automatizado, porque lo que resulta imprescindible el seguir las listas administradas con cierta asiduidad y proceder a dar de baja a los usuarios cuya dirección de correo electrónico nos está dando problemas.

Esta tarea, manual, al margen de resultar aburrida y proclive a errores, no se ve facilitada por el hecho de que, por ejemplo, algunos problemas con determinadas direcciones de correo son temporales y se solucionan tras un cierto tiempo. El caso típico es el de las cuotas de correo.

Cansado de realizar todo el trabajo sucio de forma manual, me decidí a escribir varios scripts para automatizar las tareas más ingratas y/o que me consumían más tiempo. El resultado se encuentra en esta página.

He utilizado estos scripts, con ligeras variaciones, durante años, sin ningún tipo de problema. No obstante no doy ninguna garantía, ya que buena parte de su correcto funcionamiento depende de los mecanismos de administración que utilicemos con las listas de correo. Por ejemplo, estos scripts NO bloquean las listas de correo cuando realizan algún cambio en las suscripciones; en mi configuración eso no es necesario, porque todas las altas y bajas son moderadas y tenía cuidado de no realizar aprobaciones administrativas mientras utilizaba los scripts. No obstante, la primera tarea que debería hacer cualquier persona que le interese modificar mis scripts es dotarlos del sistema de bloqueos incluído en el propio majordomo.

Dado que he migrado a mailman, libero estos scripts con la licencia GPL. Todos los scripts están escritos en SHELL (el perl no me gusta nada :-).

Todos los scripts trabajan de forma similar: bajo su directorio raíz debe existir el directorio "lists", que contiene las listas de correo, y el directorio "lists-bounce", que contiene los "bounces".


Baja de usuarios con emails problemáticos

Cuando empezamos a recibir mensajes de "bounce" desde un usuario determinado, lo más habitual consiste en darle de baja. Yo, sin embargo, no lo doy de baja definitivamente, sino que muevo a dicho usuario a otra lista de correo de "bounces", a la que envío avisos periódicos. En esa otra lista, los emails son marcados con la fecha de desuscripción, para poder eliminar a la gente que lleva mucho tiempo en esa lista y no ha tomado ninguna medida correctora.

El script se ejecuta tomando como parámetro el nombre de la lista de correo.

z-bounce-alta

#!/bin/sh

if [ $# -lt 1 ]; then
  echo Falta parametro: $0 lista
  exit 1
fi

fecha=`date "+%e/%b/%y"`

cd lists-bounce
cp ../lists/$1 .$1
vi ../lists/$1
echo
echo \*\*\* An~adiendo a lista de bounces para \"$1\":
echo

diff ../lists/$1 .$1 | grep "^> "| cut -c3-1000 >.$1.2

while read email
do
  echo $email
  echo $fecha $email >> $1-bounce
done < .$1.2

rm .$1 .$1.2

Cuando ejecutamos el script, nos aparecerá la lista de usuarios suscritos ahora mismo. La editamos con nuestro editor de texto y almacenamos los cambios. Tras salir del editor, este script comprueba las bajas que hemos hecho y las añade al fichero de "bounces" para esa lista de correo, incluyendo la fecha de la baja.

Aunque se puede hacer, no se recomienda añadir ningún email cuando se ejecuta este script. Está diseñado sólo para hacer bajas, y transferir las bajas de la lista de correo normal a la lista "bounce".


Recordatorio de "Bounces"

Cuando tenemos a usuarios en la lista "bounce" hay que enviarles mensajes periódicos informándoles de que han sido desuscritos, y del procedimiento para darse de alta nuevamente.

El script se ejecuta tomando como parámetro el nombre de la lista de correo.

z-bounce-reminder

#!/bin/sh
#
# Envia un aviso de "bounce" a todos los miembros de una lista que han sido dados de baja
#

cat lists-bounce/$1-bounce | while read fecha email
do
  email=`echo $email | sed -e 's/"[^"]*"//g' -e 's/([^()]*)//g' -e 's/.*<\(.*\)>.*/\1/'`
  echo $fecha $email
  (
    echo X-Bounce: $email
    echo From: $1-owner@argo.es
    echo Subject: Aviso desuscripcion lista \"$1@argo.es\"
    echo
    echo Este email es un aviso de que ha sido desuscrito de la lista
    echo \"$1@argo.es\" debido a que su buzon de correo
    echo \($email\) estaba rechazando los mensajes.
    echo
    echo Usted ha estado desuscrito desde $fecha.
    echo
    echo Si quiere suscribirse de nuevo a la lista, envie un mensaje
    echo informando de la solucion del problema a \"$1-owner@argo.es\".
    echo
  ) | mail -t $email
done


Recordatorio de "Bounces" en todas las listas

Normalmente el recordatorio de "bounces" se envía a todas las listas de correo.

El script se ejecuta sin ningún parámetro. Enviará notificaciones a todos los usuarios en todas las listas de "bounce".

z-bounce-reminder-all

#!/bin/sh

BOUNCE="-bounce"
for i in lists-bounce/*$BOUNCE
do
  v=`basename $i $BOUNCE`
  echo
  echo \*\*\*Informando de BOUNCES para la lista \"$v\":
  echo
  ./z-bounce-reminder $v
done


Alta de usuarios que estaban en "Bounce"

Con todo el tema de los recordarios que envía el script anterior "repescamos" a algunos usuarios, que nos piden ser resuscritos.

Para ello ejecutamos este script, cuyo parámetro es el nombre de la lista de correo.

z-bounce-baja

#!/bin/sh

if [ $# -lt 1 ]; then
  echo Falta parametro: $0 lista
  exit 1
fi

cd lists-bounce
cp $1-bounce .$1-bounce
vi $1-bounce

echo
echo \*\*\* Retirando de la lista de bounces para \"$1\":
echo

diff $1-bounce .$1-bounce | grep "^> "| cut -f3-1000 -d " " >.$1-bounce.2

while read email
do
  echo $email
  echo $email >> ../lists/$1
done < .$1-bounce.2

rm .$1-bounce .$1-bounce.2

Cuando ejecutamos el script, nos aparecerá la lista de usuarios en "bounce". La editamos con nuestro editor de texto y almacenamos los cambios. Tras salir del editor, este script comprueba las altas que hemos hecho y las añade a la lista de correo.


Control de "Bounce" con "remailers" y similares

Uno de los problemas de gestionar una lista de correo es la identificación de direcciones de email problemáticas, pero que no somos capaces de identificar. El problema es que muchos de estos sistemas envían al administrador de la lista un mensaje de error... ¡¡¡sin ninguna indicación de la dirección o direcciones de correo electrónico que han provocado el error!!!.

Cuando tenemos una lista de correo con miles de usuarios suscritos, la mayoría de los cuales utilizan "remailers", alias de correo, etc., este problema puede ser bastante "estresante".

El script que sigue envía un mensaje personalizado (y, por lo tanto, fácil de identificar) a todos los suscriptores de una lista de correo, con la esperanza de que el "bounce" generado nos permita identificar, esta vez sí, el email puñetero.

Si sabemos en qué proveedor cuelga el "remailer" o similar (bigfoot, por ejemplo), podemos hacer un "grep" en la línea que lee los suscriptores, para limitar el chequeo de "bounce" exclusivamente a los usuarios dependientes de dicho dominio, y no molestar al resto.

El script se ejecuta tomando como parámetro el nombre de la lista de correo que queremos verificar.

z-bounce-check

#!/bin/sh
#
# Envia un chequeo de "bounce" a todos los miembros de una lista
#

cat lists/$1 | while read email
do
  email=`echo $email | sed -e 's/"[^"]*"//g' -e 's/([^()]*)//g' -e 's/.*<\(.*\)>.*/\1/'`
  echo $email
  (
    echo Subject: Administratrivia lista \"$1@argo.es\": $email
    echo X-Bounce: $email
    echo From: $1-owner@argo.es
    echo
    echo Este email es una prueba de \"bounce\" para la lista \"$1@argo.es\",
    echo recibido por todos sus suscriptores para intentar determinar
    echo la direccion de email que esta rechazando correo.
    echo
    echo Normalmente la direccion es obvia, pero cuando se utilizan
    echo redirectores de correo o hay MTAs intermedios que filtran
    echo cabeceras, resulta necesario recurir a un sondeo individualizado.
    echo
    echo Si usted ha recibido este mensaje, es que todo ha ido bien.
    echo Su email no es el problematico.
    echo
    echo Este es un mensaje generado de forma automatica. Por favor,
    echo *NO* responda.
    echo
    echo Gracias por su cooperacion y disculpe las molestias. Para
    echo cualquier duda o aclaracion, escriba a \"$1-owner@argo.es\".
    echo
  ) | mail -t $email
done



Python Zope ©2001 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS