Résumé

  • RFC 5231 ajoute des comparaisons ordonnées :value et des tests :count aux tests d’adresse, d’enveloppe et d’en-tête déjà présents dans Sieve. L’unité comptée change avec le test choisi.
  • Un test d’adresse compte des boîtes aux lettres, un test d’enveloppe des adresses de transport et un test d’en-tête des occurrences de champs — pas les adresses contenues dans ces champs. La partie d’enveloppe to ne révèle volontairement que l’utilisateur courant.

« Combien de destinataires ? » n’était pas une question unique

À la lecture d’un champ To:, le décompte semble évident : deux boîtes aux lettres, deux destinataires. Mais un filtre de courrier ne fonctionne pas à partir de l’impression sociale produite par une ligne. Il traite un en-tête, une enveloppe SMTP et des structures d’adresses analysées, qui n’ont ni le même sens ni la même autorité.

Publié en janvier 2008, RFC 5231 apporte un vocabulaire relationnel aux tests address, envelope et header de Sieve. Au lieu de demander seulement si une valeur correspond, le script peut vérifier si elle est supérieure, inférieure, égale ou différente d’une valeur de test. L’extension ajoute deux types de correspondance : :value, qui compare des chaînes avec un comparateur capable de fournir un ordre, et :count, qui compte des éléments sélectionnés avant de comparer le résultat.

Les opérateurs sont gt, ge, lt, le, eq et ne. Pour :value, une valeur issue du message est l’opérande de gauche ; une valeur de la liste du script est à droite. Si l’un des côtés contient plusieurs valeurs, une seule paire satisfaisant la relation suffit à rendre le test vrai. L’ordre n’est pas une notion universelle : le comparateur choisi compte. RFC 5231 impose la prise en charge de i;ascii-numeric sur au moins des entiers non signés de 32 bits ; ce comparateur ne représente pas les nombres négatifs.

Le changement le plus instructif est :count. Supposons qu’un message comporte deux adresses de boîte aux lettres dans To: et une dans Cc:. Un test address :count portant sur to et cc compte trois éléments boîte-aux-lettres. Les noms de groupes ne s’ajoutent pas au total, mais leurs membres oui. Avec header :count sur ces mêmes noms de champs, le test compte les occurrences de champs. Dans un message conforme à RFC 2822, qui ne peut comporter qu’un champ To: et un champ Cc:, le résultat est deux — et non trois personnes.

Le test envelope :count mesure encore autre chose : les adresses des parties choisies de l’enveloppe de transport. La partie to de l’enveloppe ne contient qu’une adresse, celle de l’utilisateur dont le script Sieve s’exécute. La spécification interdit que ce test révèle si le message a aussi été remis à quelqu’un d’autre. Le nombre pour from vaut zéro si le MAIL FROM SMTP est vide, un dans le cas contraire. « Compter les destinataires » peut donc désigner les boîtes aux lettres visibles dans l’en-tête, une adresse d’enveloppe disponible pour ce script ou le nombre de lignes d’en-tête. Le nom du test ne tranche pas.

Cette distinction modifie aussi la composition des conditions. Un seul décompte d’adresses sur to et cc additionne leurs deux nombres. Pour exprimer « au moins trois dans To, ou au moins trois dans Cc », il faut deux comparaisons dans anyof ; un total combiné répondrait à une autre question : « au moins trois sur les deux champs réunis ». L’exemple du RFC renvoie vrai pour deux adresses en To et une en Cc avec le test combiné, mais faux lorsque les deux seuils sont vérifiés séparément.

RFC 5231 n’a pas créé les tests relationnels de toutes pièces. Il remplace RFC 3431, qui avait déjà introduit en 2002 l’extension et les deux types de correspondance. Le successeur met à jour la référence du comparateur, d’ACAP vers le registre des collations de RFC 4790, corrige les exemples, précise les éléments RFC 2822 comptés et retire une règle de suppression des espaces après l’ajout d’une exigence plus générale à la spécification de base de Sieve. La capacité relational figure dans le registre IANA des extensions Sieve.

Enfin, l’extension s’arrête au test. Elle ne modifie ni KEEP implicite ni les actions explicites comme fileinto, redirect ou reject. Un prédicat peut sélectionner une branche du script ; il ne prouve pas à lui seul ce que le serveur a analysé, si la branche a été exécutée correctement ni où le message a fini. Une comparaison précise n’est utile que si l’on connaît son unité, son comparateur et la surface d’implémentation.

Sources