Resumen

  • RFC 5231 añadió comparaciones ordenadas :value y pruebas :count a los tests de dirección, sobre y encabezado que Sieve ya tenía. La unidad contada cambia con el test que se elige.
  • Un test de dirección cuenta buzones; uno de sobre, direcciones de transporte; y uno de encabezado, instancias de campos, no las direcciones que estos contienen. El to del sobre solo muestra al usuario actual por diseño.

«¿Cuántos destinatarios?» no era una sola pregunta

Al mirar el encabezado To:, el recuento parece evidente: dos buzones, dos destinatarios. Pero un filtro no opera sobre la impresión social que produce una línea. Procesa el encabezado del mensaje, el sobre SMTP y estructuras de direcciones analizadas; cada superficie tiene un significado y una autoridad distintos.

Publicado en enero de 2008, RFC 5231 dio un vocabulario relacional a los tests address, envelope y header de Sieve. En vez de preguntar solo si un valor coincide, el script podía preguntar si era mayor, menor, igual o distinto que el valor de prueba. La extensión incorporó dos tipos de coincidencia: :value, que compara cadenas mediante un comparador capaz de ordenarlas, y :count, que cuenta entidades seleccionadas antes de comparar el total.

Los operadores son gt, ge, lt, le, eq y ne. En :value, un valor del mensaje ocupa el lado izquierdo de la relación y uno de la lista de claves del script, el derecho. Si hay varios valores en cualquiera de los lados, basta con que algún par satisfaga la relación para que el test sea verdadero. El orden no es una propiedad universal del texto: importa el comparador elegido. RFC 5231 exige admitir i;ascii-numeric con, al menos, enteros sin signo de 32 bits; ese comparador no admite valores negativos.

El cambio más revelador fue :count. Supongamos que To: contiene dos direcciones de buzón y Cc:, una. Un address :count sobre to y cc cuenta tres elementos buzón. Los nombres de grupo no suman, pero sí sus integrantes. Si se usa header :count con esos mismos campos, se cuentan instancias de encabezado. En un mensaje compatible con RFC 2822, que puede tener como máximo un campo To: y uno Cc:, el resultado es dos, no tres personas.

envelope :count mide otra cosa: las direcciones de las partes seleccionadas del sobre de transporte. Su parte to siempre contiene una dirección, la del usuario que ejecuta el script Sieve. La especificación exige que el test no permita saber si el mensaje también llegó a otra persona. El contador de from vale cero cuando MAIL FROM está vacío y uno cuando no lo está. Por eso «contar destinatarios» puede referirse a buzones visibles en un encabezado, una dirección de sobre disponible para este script o líneas de encabezado. El nombre del test no resuelve la ambigüedad.

La diferencia también altera cómo se combinan las condiciones. Un solo recuento de direcciones para to y cc suma ambos campos. Para expresar «al menos tres en To, o al menos tres en Cc», hacen falta dos comparaciones dentro de anyof; un recuento conjunto respondería otra pregunta: «al menos tres entre los dos campos». El ejemplo del RFC devuelve verdadero para un To con dos buzones más un Cc con uno bajo la prueba conjunta, pero falso cuando cada umbral se comprueba por separado.

RFC 5231 no inventó los tests relacionales desde cero. Sustituyó a RFC 3431, que ya había introducido la extensión y esos dos tipos de coincidencia en 2002. El sucesor actualizó la referencia del comparador de ACAP al registro de colaciones de RFC 4790, corrigió ejemplos, aclaró qué elementos de RFC 2822 cuenta COUNT y eliminó una regla de recorte de espacios después de que una condición más general pasara a la especificación base de Sieve. El registro de extensiones de IANA anota la capacidad relational.

La extensión termina en la prueba: no cambia KEEP implícito ni acciones explícitas como fileinto, redirect o reject. Un predicado puede escoger una rama del script, pero no demuestra qué analizó un servidor, si ejecutó esa rama correctamente ni dónde acabó el mensaje. Una comparación precisa solo sirve si se conocen su unidad, su comparador y la superficie concreta de implementación.

Fuentes