Resumen

  • :raw busca en la representación sin decodificar, :content en partes MIME elegidas y :text en una extracción que puede variar entre implementaciones. No existe un único cuerpo canónico para el test.
  • Un resultado auditable necesita mensaje, versión del motor, transformación, selector, comparador, errores y partes omitidas. El acierto no prueba peligro; el fallo no prueba ausencia ni inocuidad.

La frontera entre cabecera y cuerpo ya produce un caso incómodo. Si un mensaje tiene solo cabeceras y no contiene la línea vacía separadora, el conjunto de cadenas es vacío. Todos los tests body devuelven falso, incluso el que busca una cadena vacía. “No hubo cuerpo” no equivale a “hubo un cuerpo vacío”.

Cuando sí hay cuerpo, la transformación decide qué cadenas llegan al comparador. No se prueba cada línea de forma independiente; los CRLF pueden permanecer dentro de una cadena. El tipo de coincidencia y el comparador completan una tubería que a menudo desaparece detrás de una casilla que dice match.

Raw puede encontrar el embalaje

:raw toma todo el cuerpo sin decodificar como un solo elemento. Conserva transfer encodings y deja que los límites multipart y las cabeceras MIME internas participen en la búsqueda. Incluso un error sintáctico debe seguir siendo filtrable, salvo que el entorno rechace antes el mensaje completo.

Por eso una palabra encontrada en raw puede no pertenecer al texto que leyó el destinatario. Puede ser parte de una cadena base64, de un boundary, de un nombre de tipo o de un prólogo. El resultado es fiel a la representación, pero no asciende por sí solo a significado.

La unidad única también permite continuidad a través de regiones que otro modo separa. Una expresión con comodines puede abarcar bytes que una evaluación por partes nunca pondrá en la misma cadena. Cambiar de transformación cambia la pregunta.

Content define qué ramas cuentan

:content selecciona por tipo MIME y recorre de forma recursiva multiparts y mensajes encapsulados. Un type/subtype completo es exacto; un tipo sin subtipo cubre sus variantes; el selector vacío cubre todos los tipos. Una barra mal ubicada o repetida no amplía la consulta: no selecciona ninguno.

Cada parte seleccionada se compara por separado. El patrón no puede cruzar un límite MIME. Dos palabras consecutivas en la presentación final pueden vivir en partes diferentes y ser incapaces de formar una sola coincidencia. El prólogo y el epílogo de un multipart tienen su propia superficie, y la cabecera de un message/rfc822 no arrastra automáticamente los cuerpos que contiene.

El motor decodifica los transfer encodings obligatorios y convierte texto compatible a UTF-8. Pero ante una parte que no puede decodificar o convertir, el RFC permite tratarla como US-ASCII, omitirla o usar una convención local. Dos resultados falsos pueden esconder políticas de error muy distintas.

Text cambia con la capacidad instalada

:text es best effort y además es el valor por defecto. Una implementación sencilla puede limitarse a las partes de tipo text. Otra puede eliminar HTML, convertir documentos propietarios o aplicar OCR a imágenes. El estándar no obliga a que ambas produzcan el mismo número de cadenas.

Ese margen convierte una actualización de software en un cambio de política. Un nuevo convertidor puede hacer visible una palabra que llevaba años dentro de un adjunto. Un cambio de OCR puede dejar de verla. El código Sieve permanece idéntico, pero su campo de observación cambia.

La consecuencia no es prohibir la mejora. Es registrar la dependencia. Sin versión del extractor, capacidades activas, diagnósticos de conversión y hashes de las cadenas producidas, nadie puede repetir después lo que el filtro dijo haber visto.

El booleano no clasifica seguridad

El propio RFC advierte que las coincidencias raw pueden ser más generales de lo pretendido y que una búsqueda textual no sustituye a un filtro de spam, virus u otra seguridad. También exige límites de capacidad para que el uso malicioso del matching no niegue servicio a otros usuarios.

Un falso positivo puede destruir correo legítimo porque el término apareció en el embalaje. Un falso negativo puede permitir contenido peligroso porque el selector excluyó una parte o la conversión falló. La palabra “match” no cuenta cuál de esas rutas ocurrió.

RFC 5229 conserva su tema separado: variables y capturas temporales. Los comodines de body no rellenan variables de match. Esa limitación evita memoria lateral; no garantiza que la superficie extraída sea completa ni estable.

Fuentes