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

Scripts de apoyo a Mailman 2.0.*

Última Actualización: 20 de Septiembre de 2002 - Viernes

Mailman es un gestor de lista de correo escrito en Python.

Aunque yo utilizo estos scripts cpn frecuencia sin ningún problema, 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.

Libero estos scripts con la licencia GPL. Todos los scripts están escritos en Python.

Todos los scripts deben ejecutarse desde el directorio "mailman/bin" del Mailman. Aceptan un parámetro, que será el nombre de la lista sobre la que actuar.


Obtener un listado de los suscriptores con/sin "no mail"

Elegir listar usuarios con o sin "no mail" es cuestión de poner o no un "not" en el "if". Se crea una lista de usuarios seleccionados en vez de imprimirlos al vuelo directamente, porque este script servirá de base a otros más sofisticados.

Este script está escrito en Python 2.2, para Mailman 2.0.13.

import sys
import paths
from Mailman import mm_cfg
from Mailman import MailList

lista=MailList.MailList(sys.argv[1],lock=0)
suscriptores=lista.GetDeliveryMembers()
suscriptores2=lista.GetDigestDeliveryMembers()
suscriptores.extend(suscriptores2)

seleccionados=[]
for i in suscriptores :
  if lista.GetUserOption(i,mm_cfg.DisableDelivery) : seleccionados.append(i)

for i in seleccionados :
  print i


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 cada uno de 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. La lista de direcciones a sondear se lee de la entrada estándar. No se usa directamente la lista de suscritos porque nos puede interesar limitar el chequeo a dominios concretos, o hacer el chequeo por etapas si la lista tiene muchos suscriptores. A medida que se van enviando mensajes, se van imprimiendo sus emails por pantalla. Se utiliza el servidor SMTP local, que está en 127.0.0.1.

Este script está escrito en Python 2.2, para Mailman 2.0.13.

import sys
import smtplib
import paths
from Mailman import MailList

lista=MailList.MailList(sys.argv[1],lock=0)

admin=lista.GetAdminEmail()
lista_email=lista.GetListEmail()

email=smtplib.SMTP("127.0.0.1")

for i in sys.stdin.readlines() :
  i=i.strip()
  formato=(lista_email,i,i,admin,i,lista_email,admin)
  msg= """Subject: Verificacion de suscripcion para la lista "%s": %s
X-Bounce: %s
From: %s
To: %s

Este mensaje es una prueba de "bounce" para la lista
"%s", recibido por
todos sus suscriptores para intentar determinar
que direcciones de email estan rechazando correo.

Normalmente la direccion es obvia, pero cuando se utilizan
redirectores de correo o hay MTAs intermedios que filtran
cabeceras, resulta necesario recurrir a un sondeo individualizado.

Si usted ha recibido este mensaje, es que todo ha ido bien.
Su email NO esta entre los que nos estan ocasionando problemas.

Este es un mensaje generado de forma automatica. Por favor,
*NO* responda.

Gracias por su cooperacion y disculpe las molestias. Para
cualquier duda o aclaracion, escriba a
"%s".
""" %formato

  print i
  email.sendmail(admin,[i],msg)

email.quit()


Reactivación de direcciones marcadas como "Bounce"

Yo tengo configuradas mis lista de correo para que marque como "no mail" las direcciones que tienen "bounces" de forma consistente. Ello hace que existan, en mi caso, dos posibles razones para que un usuario tenga "no mail": ese buzón genera "bounces" o el propio usuario se ha marcado como "no mail". De momento voy a obviar esta segunda opción, por ser poco habitual salvo en época de vacaciones y similares.

Una vez que un usuario está como "no mail" permanece ahí de forma indefinida. En realidad esto es un problema, porque si el "bounce" está ocasionado por un error definitivo (el email ya no existe), lo lógico es dar de baja la cuenta directamente. Si, por el contrario, los "bounces" los ocasiona una problema puntual (buzón lleno, relay abierto, etc.), sería más inteligente reactivar de forma especulativa algunos de los "no mail" para ver si siguen fallando o el problema ya se ha solucionado.

Esto es lo que hace este script, reactivar un porcentaje dado de direcciones marcadas como "no mail". Acepta como parámetros de entrada el nombre de la lista de correo y un porcentaje (entre 0 y 100) de usuarios a reactivar.

Este script está escrito en Python 2.2, para Mailman 2.0.13.

import sys
import paths
import random
from Mailman import mm_cfg
from Mailman import MailList

rnd=random.Random().randrange
porcentaje=float(sys.argv[2])
lista=MailList.MailList(sys.argv[1],lock=1)
try :
  suscriptores=lista.GetDeliveryMembers()
  suscriptores2=lista.GetDigestDeliveryMembers()
  suscriptores.extend(suscriptores2)
  no_mail=[]
  for i in suscriptores :
    if lista.GetUserOption(i,mm_cfg.DisableDelivery) : no_mail.append(i)

  print "La lista tiene %d suscriptores, de los cuales %d estan como 'no mail'" %(len(suscriptores),len(no_mail))
  num=porcentaje/100.0*len(no_mail)
  print "Reactivamos el %.1f%%, que son %d direcciones:" %(porcentaje,num)

  for i in xrange(num) :
    n=rnd(0,len(no_mail))
    print no_mail[n]
    lista.SetUserOption(no_mail[n],mm_cfg.DisableDelivery,0,save_list=0)
    del no_mail[n]

  lista.Save()
finally :
  lista.Unlock()


Historia

  • 20/Sep/02: Añado el script para reactivar direcciones con "no mail".

  • 19/Sep/02: Primera versión de esta página.



Python Zope ©2002 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS