La conversión de reglas de correo Thunderbird -> Sieve contraataca

Ha transcurrido un año desde el artículo Migrar Thunderbird de "mbox" a "IMAP" (VII): Filtrado en el servidor IMAP4 con Sieve y conversión de reglas Thunderbird. Todo ha funcionado a la perfección hasta el momento. Lo cierto es que el proyecto ha sido un completo éxito.

Esta semana me han surgido dos problemas simples de resolver, pero que vale la pena documentar. Este artículo expande Migrar Thunderbird de "mbox" a "IMAP" (VII): Filtrado en el servidor IMAP4 con Sieve y conversión de reglas Thunderbird. Léelo primero.

  1. El conversor mUTF-7 a UTF-8 para Sieve ha cambiado con la aparición de Python 3.5:

    1
    2
    3
    4
    5
    6
    7
    8
    9
      #!/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(bytes(linea, 'ascii'))
          print(linea, end='')
    

    Ha cambiado línea 8, donde convertimos la cadena UTF-8 a bytes antes de aplicar la conversión a mUTF-7.

  2. El segundo problema era el script Mozilla filter to sieve converter.

    Al intentar convertir la siguiente regla de correo de Thunderbird a Sieve usando mozfilter2sieve:

    name="NocONName"
    enabled="yes"
    type="17"
    action="Move to folder"
    actionValue="imap://jcea@127.0.0.1/hacking/NocONName"
    condition="AND (\"list-id\",contains,<noconname.listas.noconname.org>)"
    

    obtenemos la siguiente regla Sieve:

    1
    2
    3
    4
    5
    6
      # rule:[NocONName]
      if
      {
       fileinto "hacking/NocONName";
       stop;
      }
    

    El problema está en la línea 2. El if está vacío.

    Investigando el asunto con calma, veo que el problema es la aparición de la subcadena name en la condición. La conversión de cualquier regla que incluya la subcadena name en alguna parte se realizará de forma incorrecta. Esto es un bug del script mozfilter2sieve. Buceando en Javascript, un lenguaje que prefiero tocar lo menos posible, localizo el problema y propongo el siguiente parche:

    --- mailfilters.html_old 2015-10-28 17:00:13.514167123 +0100
    +++ mailfilters.html     2015-10-28 14:46:24.941671599 +0100
    @@ -301,7 +301,7 @@
         allRulesText = allRulesText.replace(/\n/g,'~!@!~');    // always runs regexes as multline
    
         // Obtain all blocks of lines that begin with name=
    -    oneRule = /(name=.+?)(?=name|$)/g;
    +    oneRule = /(name=.+?)(?=name=|$)/g;
         ruleTexts = allRulesText.match(oneRule);
    
         if (!ruleTexts || ruleTexts.length < 1)
    

    El cambio es sutil, pero importante: la expresión regular buscaba la subcadena name, mientras que ahora buscamos la subcadena name=. Con este cambio evitamos los falsos positivos. Ya no interpretaremos noconname como una coincidencia.

    Ahora la regla Thunderbird se convierte correctamente a Sieve:

    # rule:[NocONName]
    if  header :contains "list-id" "<noconname.listas.noconname.org>"
    {
     fileinto "hacking/NocONName";
     stop;
    }
    

Solo he tenido que tocar esto en un año de funcionamiento. No está mal.