martes, noviembre 03, 2009

sex.py, o como validar direcciones de correo



Necesitaba limpiar una carpeta llena de archivos .txt, una Maildir en realidad, repletos de encabezados de rebotes y explicaciones de los majordomos y mailer-daemons. Es decir, recorrer esta marabunta de archivos, y volcar las direcciones de correo que allí figuraran.

Y me encontré con un tremendo programa, sex.py - este programa ya no puede encontrarse en el sitio de los desarrolladores, de modo que subi una copia aqui:

http://www.bunker.org.ar/incubadora.varios/Tools/sex.py

Actualización: Antes de ejecutarlo, suministrarle unas librerías necesaria:

sudo apt-get install python-dnspython python-ldns  python-adns python-dns

Ejemplo:

python sex.py -sr Maildir/ base.txt

Este script es prácticamente una aspiradora de direcciones de correos, y puede ser apuntado hacia cualquier cosa, una url, un archivo, una carpeta, comparando con servidores dns por direcciones de correo validas, ordenando, quitando duplicados, volcando resultados a otro archivo, de todo.

Ejemplo para chequear si son direcciones validas desde el punto de vista del DNS:

sex.py -y  base.txt | tee comparados.csv

Paciencia... este paso demora mucho. Y cuando termina veremos muchos codigos de error de todo tipo. Cuentas saturadas, inexistentes, mail server que evitan la conexion, filtros antispam celosos, etc.

Ocasionalmente aparecen algunos con codigo 250, que no son error pero que aparecen aquí.

De modo que evito estos "250" con

grep -v '250' comparados.csv > comparados2.csv

Ahora conviene abrir el comparados2.csv con openoffice, y quedarse con la columna A. Luego, esa columna puede pegarse en gedit para evitar durante la comparación que viene a continuación, problemas con codificaciones. El archivo mas limpio que obtenemos con gedit podriamos llamarlo, por ejemplo, sucios.txt

Tenemos ahora un archivo con direcciones que no sirven. Si quiero compararlos con mi archivo original, gigantesco de correos, y crear un nuevo archivo de direcciones validas:

for i in `cat base.txt`; do echo $i|grep -v -f sucios.txt; done > limpitos.new

Ojo que este for puede demorarse bastante. Chequear en otra terminal mediante un

tail -f limpitos.new

Listo, ahora me aseguro de no sobre exigir el smtp con rebotes innecesarios (que siempre son la mayoría). Además, es de unos amigos, y no quiero abusarme.

Otra alternativa a este bucle, a veces incompatible con algunos shells, son las siguientes líneas que disfruté programando en ruby.

i = 0
File.open('base.txt', 'r') do |f1|
  while linea = f1.gets
    File.open('sucios.txt', 'r') do |f2|
      while linea2 = f2.gets
        if linea == linea2
          #puts "mail que existe en rebotados! - se debe ignorar" + linea
          sucio = 1
          break
        else
          sucio = 0
        end
      end #fin while 2
      unless sucio == 1
        puts linea
        i = i + 1
      end
    end #fin segundo file.open
  end #fin primer while
end #fin primer open
puts "Total limpios " + i.to_s
 

Se puede bajar desde http://www.bunker.org.ar/incubadora.varios/Tools/limpiar.rb

Eso es todo. Ahora se puede usar esta salida con algún programa como ssmtp, o para lo que usted quiera. Yo lo uso con mi Regadera. Como dato, de una base de 8000 correos, me quedaron limpios 6634, y sumado a la comprobación de que tienen muy buenas posibilidades de saltar filtros anti spam.

Saludos

1 comentario:

pancutan dijo...
Este comentario ha sido eliminado por el autor.