Migrar Thunderbird de "mbox" a "IMAP" (VII): Filtrado en el servidor IMAP4 con Sieve y conversión de reglas Thunderbird

Como queda claro en mi artículo Migrar Thunderbird de "mbox" a "IMAP" (VI): Experiencia tras dos semanas, el siguiente paso es realizar el filtrado de correo en el propio servidor IMAP4, en vez de utilizar los propios filtros de correo de Thunderbird. Las ventajas son muchas:

  • Como se explica en el artículo anterior, Thunderbird se atasca más de lo razonable con muchas reglas de correo y muchos mensajes. En mi caso recibo del orden de 4.000 mensajes al día y tengo 1.800 reglas de correo. Reglas para clasificar el correo. Reglas para marcarlo con etiquetas. Reglas para darle prioridad, etc.

  • A medio plazo el plan es tener IMAP4 también en mi servidor de correo. Ejecutar las reglas de filtrado ahí con Sieve en vez de que el filtrado lo realice Thunderbird me permite tener el correo en el móvil de forma manejable, y no como lo tengo ahora (una cuenta separada con forwarding a la cuenta normal, porque no puedo permitirme recibir miles de mensajes en el móvil).

    Además las acciones realizadas en el móvil como leer o responder un mensaje tendrían su reflejo en el portátil y viceversa.

No quiero hacer la migración de filtros Thunderbird a Sieve una vez y luego trabajar con Sieve para siempre. Me interesa seguir manejando mis filtros con Thunderbird, porque los actualizo y modifico con frecuencia. El procedimiento de conversión debe ser simple y ligero.

Y ahí empiezan mis problemas.

Tras configurar Sieve en el LDA y LMTP de Dovecot, y crear un script Sieve sencillo para verificar su funcionamiento (¡a la primera!) me enfrento a la conversión. La conversión de 1800 filtros de correo. Puff.

Hay muchas páginas en Internet que te permiten introducir tus reglas de correo Thunderbird y te devuelven las reglas Sieve convertidas. Algunas están anticuados y emplean extensiones deprecated, pero lo más grave de todo es que TODAS ELLAS funcionan de la misma manera: copia en esta caja de texto tus reglas de correo y en esta otra caja de texto puedes ver las reglas convertidas.

Lo siento, señores, esto no es una opción con 1800 reglas de correo y un fichero msgFilterRules.dat [1] de 300Kbytes. No, no puedo copiar eso en mi portapapeles y pegarlo en esa caja de texto del navegador. Y no, tampoco puedo copiar los 200Kbytes de resultado en un fichero de texto. A mano. No es una opción.

[1] msgFilterRules.dat es el fichero donde se almacenan las reglas de filtrado de correo en Thunderbird.

Para alguien con una configuración más simple puede ser suficiente, así que incluyo algunos enlaces:

Hay más ejemplos por ahí, esto es solo una muestra. Pero todas funcionan igual: copia aquí tus reglas de Thunderbird y copia de aquí tus reglas convertidas a Sieve.

Yo necesito enchufarle un fichero de cientos de kbytes y miles de reglas y obtener una conversión a Sieve en un tiempo razonable. Que me guarde el resultado en un fichero. Y poder repetir el proceso con frecuencia.

Tengo conocimientos de temas de parsing y compiladores y me planteé escribir algo yo mismo, pero preferí agotar primero todas las opciones disponibles. Esta migración ya me está llevando demasiado tiempo y esfuerzo.

El código más prometedor que he encontrado, aunque muy lejos de ser perfecto en más areas de las que quiero reconocer, es Mozilla filter to sieve converter (mozfilter2sieve). Se trata de una página web y Javascript de las de "copia aquí tus reglas y aquí tienes la conversión". Pero teniendo el código te permite toquetear. La conversión no se realiza en un servidor externo, sino que se hace en el propio Javascript de la página web. Es decir lo puedo modificar y ejecutar en local, sin depender de nadie.

Me descargo el código, que mide 12 kbytes, y le echo un vistazo. Javascript está muy lejos de ser mi lenguaje favorito, pero me es accesible para lo que necesito tocar.

Lo primero que hago es buscar la caja de texto donde se pegan las reglas de correo de Thunderbird. Es algo de este estilo:

<textarea id="mozillainput" name="mozillarules" rows="20" cols="100">
</textarea>

Si en esa parte del código fuente inserto directamente el contenido del fichero msgFilterRules.dat tal cual, ya no tengo que hacer el "copia y pega" en la interfaz web. Usando vi, que es mi editor habitual, esta operación supone una línea en modo comando.

Perfecto.

El siguiente paso es hacer que el fichero Sieve resultante se almacene en disco, en vez de tener que hacer un "copia y pega". Resumiendo una historia aburrida, empleo la librería FileSaver.js y cambio mozfilter2sieve de la siguiente manera:

  1. Descargo la librería FileSaver.js y la guardo en disco duro.

  2. Al principio de mozfilter2sieve añado una referencia a dicha librería:

    <script type="text/javascript" src="FileSaver.js"></script>
    
  3. Cambio la rutina Javascript showOutput de mozfilter2sieve para que en vez de rellenar el area de texto de salida nos solicite grabar el resultado en un fichero:

    function showOutput(msg)
    {
        var blob = new Blob([msg], {type: "text/plain; charset=utf-8"});
        saveAs(blob, "prueba.sieve");
    }
    
  4. Las reglas Sieve así generadas son válidas pero emplean una extensión Sieve llamada imapflags que está marcada como deprecated en la documentación de Dovecot. Se puede activar esa extensión manualmente o bien hacer los cambios necesarios para emplear su evolución natural: imap4flags.

Lo que tenemos al final es que convertir mis reglas de filtrado Thunderbird a Sieve es un proceso simple que me lleva menos de un minuto. Puedo seguir empleando Thunderbird como gestor de reglas y actualizarlas allí, y pasarlas a Sieve y transferirlas al servidor cuando sea necesario.

Sigo este proceso y el resultado es que Sieve funciona a la primera y que Thunderbird ya no se achucha por las mañanas.

¡Victoria!.

Solo hay dos detalles que faltan por solucionar para terminar esta migración épica:

  1. Thunderbird almacena los nombres de las carpetas en sus filtros de correo IMAP4 en mUTF-7, pero Sieve espera que las carpetas se especifiquen en UTF-8. No habría problema si Mozilla filter to sieve converter realizase la conversión, que es quien debe hacerlo, pero es obvio que sus autores no utilizan idiomas raros con tildes, eñes y esas cosas.

    Lamentablemente el fichero msgFilterRules.dat y, por extensión, la conversión a Sieve realizada por mozfilter2sieve, es una mezcla extraña de UTF-8 y mUTF-7. Así que debemos ser un poco selectivos en cuanto a dónde y cómo realizar la traducción. Una posibilidad sería el siguiente código Python:

    #!/usr/bin/env python3
    
    import sys
    from imapclient import imap_utf7
    
    for linea in sys.stdin.readlines() :
        if linea.strip().lower().startswith('fileinto ') :
            linea = imap_utf7.decode(linea)
        print(linea, end='')
    

    En este código intentamos limitar la conversión exclusivamente a los nombres de las carpetas de correo, ya que el resto del fichero ya es UTF-8.

    Primer problema solucionado.

  2. Cuando el filtrado de correo lo realiza Thunderbird obviamente sabe cuándo una carpeta recibe un mensaje nuevo. A fin de cuentas lo ha metido él ahí. Actualiza correctamente los contadores de la carpeta de correo y la información asociada a la misma, notablemente las Saved Searches. Una característica que yo utilizo de forma intensiva para organizar mi trabajo.

    En general Thunderbird no se entera de los cambios que se producen en el IMAP4 a menos que abramos la carpeta de correo implicada en el GUI. Thunderbird actualiza su visión de las carpetas de correo cuando se lanza y luego considera que la única fuente de cambios es él mismo. Al menos hay que agradecerle que actualice su visión del mundo cuando se activa una carpeta concreta en el GUI...

    Ahora que el filtrado de correo se realiza directamente en el servidor IMAP4 mediante Sieve, Thunderbird no se entera del correo nuevo y, lo que es más grave para mí, no actualiza la información de carpetas con correo pendiente de lectura ni las Saved Searches. Esto es crítico y es uno de los motivos por los que he pasado casi un año dándole vueltas a esta migración y a sus implicaciones en mi forma de trabajar y organizarme.

    Se trata, en realidad, de una limitación del protocolo IMAP4 original. En IMAP4 se seleccionan carpetas de correo (una por conexión) y sólo nos enteramos de los cambios que un agente externo produce en las carpetas seleccionadas. Si solo abrimos cinco conexiones, solo podemos monitorizar un máximo de cinco carpetas. Yo tengo 1.000 carpetas de correo, muchas de ellas activas y un número no despreciable (desde luego, más de cinco y de diez) de carpetas con una actividad importante.

    Sí, señores. IMAP4 es un protocolo de compromiso entre muchas implementaciones diferentes de mensajería, en su momento, y tiene carencias básicas. Es el máximo común divisor de lo que soportaba cada servidor de acceso a correo que era alguien en el mundo. Pero un servidor IMAP4 moderno puede soportar muchas extensiones convenientes de IMAP4. Una de ellas es la extensión NOTIFY, que nos permite monitorizar la actividad de todas las carpetas en tiempo real, a través de una única conexión y encima pudiendo usar dicha conexión para más cosas.

    Lamentablemente la versión actual de Thunderbird no soporta NOTIFY [2]. Y lo que para otros resulta una molestia, para mí resulta esencial.

    [2]

    No soy el único clamando por soporte de NOTIFY en Thunderbird. Algunos ejemplos:

    • Bug 479133 - Add support for IMAP NOTIFY extension rfc rfc5465.
    • Bug 701325 - Monitoring multiple folder using IMAP IDLE.
    • Bug 716343 - Tabs don't IDLE, nor refresh with F5.

    Estoy convencido de que si GMAIL soportase NOTIFY mañana (no lo hace, ni hay planes para ello), implementarlo en Thunderbird se convertiría en una prioridad. Es lo malo de las dictaduras de la mayoría.

    Mientras tanto todas las universidades, empresas e ISPs con servidores IMAP4 modernos e inteligentes se conforman con sufrir en silencio :-(. Dura es la vida del profesional serio :-(.

    Ya imaginaréis que si al final realicé todo este trabajo, tras un año reflexionando sobre ello, es porque tenía una solución al problema de Thunderbird y NOTIFY.

    Atentos a sus pantallas.

Actualización 20141011: Puedes leer el episodio final de este culebrón en IMAP4 NOTIFY addon for Thunderbird!.

Actualización 20151020: Actualización de este artículo en La conversión de reglas de correo Thunderbird -> Sieve contraataca.