Migrando de POP3 a IMAP con carpetas de correo en el server usando Courier-IMAP y MS-Outlook, con qmail, SpamAssassin y Procmail

En esta nota voy a hablar sobre el proceso de migración que realicé en la forma de entrega de mensajes
para realizar los siguientes cambios:

  • Preclasificación de mensajes basura en el servidor.
  • Aprendizaje automático con técnica bayesiana.
  • Almacenamiento del contenido de las carpetas personales de Outlook en el servidor, para acceso mediante Webmail.
  • Cambio de configuración de Outlook para que trabaje con las carpetas de correo en el servidor.

Escenario

Se tiene el siguiente escenario:

  • Servidor Linux Fedora 8 con qmail 1.05 como MTA para envío de mensajes por SMTP, Courier 4 como servidor IMAP y POP3, Procmail como MDA para entregar los mensajes en la casilla del usuario.
  • Webmail basado en SquirrelMail, que utiliza carpetas IMAP.
  • Clientes basados en Windows
    con Outlook 2000 y XP que bajan el correo a sus máquinas con protocolo POP3.

Esto tenía los siguientes problemas:

  • Los mensajes se almacenaban en las computadoras de los usuarios, con el consiguiente riesgo de pérdida de los datos almacenados ante el robo o destrucción de la PC.
  • El webmail solamente podía mostrar los mensajes aun no entregados a la PC del usuario, por lo que un usuario que no tuviera su computadora a mano no podría consultar los mensajes previos enviados al cliente.
  • No existía una solución al problema del correo basura: las casillas de los usuarios se veían diariamente invadidas por cientos de mensajes no deseados y no había ninguna manera de detener su irresistible flujo.

La solución implementada tiene las siguientes características:

  • Se almacenan los correos en el servidor con el formato de
    Maildir aceptado por Courier IMAP y Procmail.
  • Procmail hace filtrar el contenido del mensaje por el spamAssassin y a partir de la banderita de Spam que el SpamAssassin le agrega, deriva el mensaje a la Bandeja de entrada o a una bandeja de basura.
  • El Outlook consulta las carpetas IMAP y permite al usuario administrar los mensajes que contienen, y éste además puede mover los mensajes considerados basura que cayeron en la Bandeja de Entrada a la carpeta Basura y vice versa.
  • Mediante Cron se ejecutan unos scripts que llaman al SpamAssassin para que aprenda a partir de los mensajes clasificados por los usuarios, y que borran los mensajes basura almacenados desde hace mucho tiempo.

Realización

El proceso de migración tuvo las siguientes etapas:

  1. Se instaló SpamAssassin con filtro bayesiano.
  2. Se subió al servidor el archivo de
    carpetas personales del usuario
    , se utilizaron scripts para convertir el PST al formato aceptado por el Courier-IMAP.
  3. Se cambió la configuración del Outlook para consultar las carpetas IMAP en vez de usar POP3.
  4. Se cambiaron las instrucciones de entrega del qmail, se agregaron instrucciones de Procmail para la entrega de mensajes a la bandeja de entrada o basura según indicación del SpamAssassin.
  5. Se crearon scripts para aprender de la basura y borrarla, y se configuró la crontab del usuario para que se ejecute después de hora el proceso.

Instalación de SpamAssassin

Primero de todo se instaló SpamAssassin. El servidor ya tenía instalada la versión de Perl que fue necesaria para realizar la instalación. SpamAssassin requiere algunos paquetes de Perl que hay que
instalar previamente. Los requisitos para la instalación de SpamAssassin pueden consultarse en esta página web (en inglés): http://svn.apache.org/repos/asf/spamassassin/branches/3.2/INSTALL

Yo ejecuté lo siguiente:

[root@localhost] # perl -MCPAN -e shell

cpan shell — CPAN exploration and modules installation (v1.9301)
ReadLine support enabled

cpan[1]>o conf prerequisites_policy ask
cpan[2]>install Mail::SpamAssassin

El script me instaló el SpamAssassin (que a este momento la versión mas actual es 3.2.5). A esa instalación le hice los siguientes cambios:

  • Lo configuré para que se ejecute como demonio bajándome un script de inicio. Hagan click aquí para ver el fuente.
  • Le escribí una configuración en el archivo /etc/sysconfig/spamassassin:

SPAMDOPTIONS=”-d -c -s mail –min-children=5 –max-children=10 –min-spare=5″

Estas opciones configuran: -d para “Demonizarlo”. O sea, para que esté siempre en memoria y no haya que cargar todo el SpamAssassin para cada mail. -s mail para que realice el registro de sus acciones en el /var/log/maillog. Las otras opciones, son para controlar la cantidad mínima y máxima de procesos iniciados con anticipación para analizar mensajes. –max-children limita la cantidad máxima de procesos SpamAssassin que pueden ejecutarse. El SpamAssassin a medida que analiza mensajes, puede realizar hasta esa cantidad de análisis simultáneos, y hará una indicación en el maillog cuando tropiece con este límite.
Para mejorar el desempeño de análisis, se puede aumentar este límite a costa de consumir más memoria al servidor. –min-children controla la cantidad mínima de procesos SpamAssassin que pueden ejecutarse, de manera que haya siempre una cantidad “en guardia” para
analizar mensajes. –min-spare controla la cantidad de procesos “de sobra” que hay que tener, por si ocurre un pico de mensajes y la creación de procesos de SpamAssassin no se puede hacer con la suficiente velocidad. Los valores de ejemplo tienen un desempeño muy bueno, el análisis es muy rápido y la carga es bastante pareja.

El filtro bayesiano viene habilitado por defecto, y por las dudas se dejó constancia en el archivo de configuración para cada usuario, que se configurará luego.

Migración de carpetas personales

Este paso es, por lejos, el paso más largo del proceso.
Primero de todo, se requiere subir al servidor, por FTP o SCP o el método que sea, el archivo de carpetas personales del usuario. Este método es largo de implementar, pero una vez realizado, es rapidísimo, es terriblemente adecuado para migrar las carpetas personales de 25 usuarios como me tocó a mí. Todo este método me tomó no más de un día desarrollar, y después la conversión de carpetas para cada usuario se realizó mediante 3 scripts automáticos y se tardó 5 minutos en promedio para cada uno.

El propio Outlook permite mover las carpetas de mensajes de las carpetas personales al servidor IMAP. Simplemente, se elimina la cuenta POP3 actual, se crea la cuenta IMAP, y una vez que se ve el nuevo árbol de carpetas, simplemente con el mismo Outlook se arrastra cada carpeta y se sube al servidor. El problema es que tarda muchísimo con cada mensaje, y la verdad, no da para migrar un mont&
oacute;n de usuarios en un día como tuve que hacer yo. Si quieren hacer este proceso igual para ver cómo es y de paso aprender un montón de cosas, léanlo; de lo contrario, no hagan nada de esto y sigan leyendo más abajo.

Se requiere el siguiente software:

  • readpst, incluído en el paquete libPST, que se baja de http://alioth.debian.org/projects/libpst/.
  • Mb2md-3.20.pl, que se baja de http://wiki.dreamhost.com/Mb2md.
  • Una corrección a ese script que le hice para que funcione correctamente con el resultado del readpst.
  • Un script que usé para mover las carpetas creadas por el mb2md al directorio Maildir, donde se almacena el correo del usuario en el servidor. Para ver el fuente haga click aquí.

El proceso que se realizará es el siguiente:

  1. Se utiliza readpst para extraer el contenido de los mensajes de correo del archivo PST. Este software entiende el formato del archivo de carpetas personales y genera, de acuerdo a los parámetros que se le indican, una estructura de carpetas compatible con sistemas Unix convencionales (que usan casillas del tipo Mailbox) y con distintos clientes de correo, incluídos MH y Evolution. Aparentemente el formato MH era el más adecuado, pero el software no replicaba la jearaquía de carpetas dentro del PST e importar con esas opciones fue un desastre. Se decidió pasarle parámetros para que cree casillas Unix con la jerarquía de carpetas existente en el PST como entrada para el mb2md.
  2. Se utiliza mb2md para tomar las carpetas Unix generadas por el readpst y convertirlos al formato Maildir (donde un archivo es un mensaje,
    en lugar de tener un archivo con todos los mensajes como en los mailbox). Ese conjunto de carpetas creadas tendría que ser bien interpretado por el Courier-IMAP. Pero hubo un pequeño detalle: resulta que cuando se terminó de ejecutar el readpst descubrí que había creado en cada directorio un archivo llamado mbox, que luego el mb2md interpretó como que había que crear un maildir más con los mensajes contenidos en el archivo mbox, entonces creó una carpeta más con nombre terminado en .mbox.
  3. Se utiliza un script para mover esos Maildirs que terminan en .mbox al Maildir del usuario.

Pasemos a una explicación con código fuente.

Una vez subido el archivo de carpetas personales, usé su para ejecutar todos los comandos bajo el nombre de usuario propietario de la casilla con la que trabajo.

# su – juancho
$ mkdir origen
$ mkdir destino

Ahora, ejecutamos el comando readpst. Asumo que estamos en el directorio del usuario juancho, p/ej. /home/juancho.

$ readpst -b -r -o origen Outlook.pst

Explicación de los parámetros:

-b es para evitar que readpst genere un adjunto adicional para cada mensaje con el texto de ese mensaje en formato RTF. Me pareció desagradable, y además, innecesario.
-r hace que la salida del programa sea “Recursiva”, y vaya creando carpetas y subcarpetas tal como tenía el usuario en su PST, y en cada carpeta deposita un archivo mbox con los mensajes de esa carpeta.
-o origen hace que el resultado de la ejecución vaya a parar a la carpeta origen. De esta carpeta es de donde el mb2md toma los mensajes para convertirlos al formato Maildir.

Supongamos que las carpetas originales eran,

+- Bandeja
de entrada
   |
   +- Agustin
   +- Carolina
   +- Pedro

Quedará la siguiente jerarquía dentro de la carpeta destino:

+- Carpetas Personales
   |
   +- Bandeja de entrada
      |
      +- Agustin
      +- Carolina
      +- Pedro

Y dentro de cada una de esas carpetas quedará un archivo llamado mbox con los mensajes que la carpeta original del PST tenía.

Detalle muy importante: las carpetas personales no tienen que tener nombres con acentos ni tampoco con ampersands (&). El que no interpreta los nombres con acentos es el Courier, que tiene su propia forma de representar los caracteres acentuados en los nombres de las
carpetas. Todas las conversiones van a salir bien, pero si no se tienen en cuenta las carpetas, en la vista de carpetas del servidor IMAP van a faltar carpetas porque el Courier las va a ignorar.

Ahora viene el segundo paso. Ejecutamos mb2md con el resultado dejado por el readpst.

Antes que nada hay que aplicarle una corrección al archivo mb2md-3.20.pl. Resulta que en un Maildir, la fecha que el Courier-IMAP interpreta como la fecha de recepción del mensaje, es la fecha de creación del archivo. Entonces el mb2md intenta ser muy inteligente y tomar esa fecha del mensaje, yendo a la línea From: con la que todo mensaje de mailbox empieza, y recortando todo lo que no es fecha. Pero comete una sutil equivocación: en las carpetas personales Unix, el encabezado From que el mb2md busca es el siguiente:

From juancho@juancho Wed, 14 Dic 2008 GMT

Lo que el readpst deposita, es lo que obtiene del archivo de
carpetas personales, que en vez de tener la dirección de e-mail de la persona y nada más, tiene el nombre de la persona entre comillas. El mb2md no está diseñado para encontrar el nombre de la persona entre comillas y sacarlo. Recorta la línea hasta el primer espacio en blanco que encuentra y eso suele ser la mitad del nombre de la persona, por lo tanto guarda mal la fecha y después no la puede interpretar para asignársela al archivo de destino, y en consecuencia, todos los mensajes importados tienen la fecha de recepción del momento en que se hizo la importación. Un verdadero desastre para los usuarios.

El readpst escribe esto en el encabezado From:

From “Juancho” Wed, 14 Dic 2008 GMT

Entonces corregí el mb2md para que elimine todo lo que está entre comillas.

A la altura de la línea 1148 de mb2md-3.20.pl insertar este parche:

r
if ($fromline =~ m/^\”.*\”.*/ )
{
# Elimino todo lo que este entre las comillas, es el nombre de una persona.
$fromline =~ s/^\”.*\”//;
}

Entonces después de esto el script hace las cosas bien, interpreta correctamente la fecha y el Courier-IMAP entiende la fecha de recepción correcta, que luego informa al Outlook al chequear los mensajes.

Los que prefieran el archivo diff pueden obtenerlo aquí

Finalmente, ejecutamos el comando, una vez parchado:

$ mb2md-3.20.pl -s /home/juancho/origen -R -d /home/juancho/destino

Eso crea la siguiente estructura de carpetas:

.Carpetas Personales
.Carpetas Personales.Bandeja de entrada
.Carpetas Personales.Bandeja de entrada.mbox
.Carpetas Personales.Bandeja
de entrada.Agustin
.Carpetas Personales.Bandeja de entrada.Agustin.mbox
.Carpetas Personales.Bandeja de entrada.Carolina
.Carpetas Personales.Bandeja de entrada.Carolina.mbox
.Carpetas Personales.Bandeja de entrada.Pedro
.Carpetas Personales.Bandeja de entrada.Pedro.mbox

Dentro de cada una de esas carpetas, están las 3 carpetas típicas de los Maildirs, cur/, new/ y tmp/. Pero las únicas que tienen mensajes son las terminadas en mbox; como les conté antes, el readpst depositó archivos llamados mbox dentro de cada una de las carpetas y el mb2md recibió eso y donde vio los archivos mbox, creó otra carpeta más con ese nombre agregado al final y extrajo los mensajes de esos mbox.

Esa forma de crear carpetas es la que interpreta el Courier-IMAP: debajo de la carpeta Maildir/ del usuario, tiene que haber carpetas cuyo nombre empieza en “.”. Para hacer que una carpeta esté dentro de
otra, se creará otra carpeta en el mismo directorio que la otra, pero con el nombre de esta agregado y separado con un . como en el listado que les coloqué. Ahora, las que nos interesan son las carpetas terminadas en mbox que contienen los mensajes.

Ahora viene el tercer paso. Ejecutamos este pequeño script dentro de la carpeta destino:

#!/bin/sh

find . -name .\*mbox|while read line
do
  echo “Trabajando en $line”
  mv “$line” “/home/juancho/Maildir/${line%.mbox}”
done

La migración ya está terminada. Ahora falta cambiar la configuración del Outlook y asegurarse que lea las carpetas IMAP que ahora contienen los mensajes.

Cambio de configuración en el Outlook

Después lo que siguió fue muy fácil en comparación. Hubo que borrar la configuració
n del Outlook de cada usuario, y configurarle de nuevo la cuenta de correo. Una salvedad: Outlook sigue dependiendo del archivo de carpetas personales para guardar los mensajes enviados, algo que fue imposible de mejorar. Encontré por ahí unas páginas que decían que para Outlook 2003, eso iba a ser mejorado y se iban a mandar los enviados en el servidor, pero un compañero del trabajo se instaló Outlook 2003 y no vi evidencia en su computadora de que eso estuviera funcionando ni ninguna opción para habilitarlo.

Lo que se necesita es crear una regla (Herramientas-> Asistente para reglas) para copiar los mensajes enviados al servidor.

El procedimiento es el que sigue. En el asistente para reglas, ir seleccionando las siguientes opciones:

  1. Empezar desde una regla en blanco.
  2. Comprobar los mensajes después de enviar.
  3. Mover una copia del mensaje a la carpeta especificada. Ahí,
    hacer click en la palabra "especificada", y en el árbol de carpetas, seleccionar la carpeta Sent del árbol IMAP.
  4. Finalizar.

Hay que tener el siguiente cuidado: si se llega a cortar la conexión a internet cuando el Outlook está abierto, este entra en modo Sin Conexión. Hacer click en "Conectar con la cuenta" no funciona (según mi experiencia). El único remedio es cerrar y volver a abrir el Outlook. Si está en modo Sin Conexión y se intenta mandar un mensaje, la regla se desactiva . Eso hay que tenerlo controlado porque puede desactivarse y así no se copian más los mensajes al servidor. Varios usuarios me dijeron que en el servidor no estaban los mensajes, y eso es porque no tenían activadas las reglas.

Be the first to comment

Leave a Reply

Your email address will not be published.


*