Resumo

  • A RFC 5231 acrescentou comparações ordenadas :value e testes de contagem :count aos testes address, envelope e header já existentes no Sieve. O resultado de :count depende do objeto analisado.
  • A contagem de endereços mede caixas postais; a de envelope, endereços de transporte; e a de cabeçalho, ocorrências de campos — não os endereços escritos neles. O envelope :count em to expõe intencionalmente apenas o usuário atual.

“Quantos destinatários?” não é uma pergunta só

Olhar para a linha To: de uma mensagem parece suficiente para contar destinatários. Se há duas caixas postais, seriam duas pessoas. Mas um filtro de correio não opera sobre a impressão visual de uma linha. Ele pode examinar o cabeçalho da mensagem, o envelope SMTP e estruturas de endereços já analisadas — superfícies com significados e autoridades diferentes.

Publicada em janeiro de 2008, a RFC 5231 acrescentou operadores relacionais aos testes address, envelope e header do Sieve. Em vez de apenas perguntar se um valor corresponde a outro, um script passou a poder testar se ele é maior, menor, igual ou diferente. A extensão introduziu dois tipos de comparação. :value compara valores usando um comparador que fornece informação de ordenação; :count conta os elementos selecionados antes de compará-los.

Os operadores são gt, ge, lt, le, eq e ne. Em :value, um valor extraído da mensagem fica à esquerda da relação, e um valor da lista de chaves do script fica à direita. Quando há vários valores em qualquer lado, basta um par satisfazer a relação para o teste ser verdadeiro. A ordenação depende do comparador escolhido, não de uma noção universal de linguagem natural. A RFC exige suporte a i;ascii-numeric, que deve aceitar pelo menos inteiros sem sinal de 32 bits; esse comparador não representa números negativos.

A mudança mais reveladora está em :count. Suponha que To: contenha dois endereços de caixas postais e Cc:, um. Um teste address :count sobre to e cc conta três caixas postais. O nome de um grupo não entra na soma, embora as caixas postais dentro dele entrem. Já header :count para to e cc conta ocorrências de campos. Em uma mensagem comum conforme à RFC 2822, com um campo To: e um Cc:, o resultado é dois — não três pessoas.

envelope :count mede outra coisa: os endereços das partes selecionadas do envelope de transporte. O envelope to contém sempre uma única entrada, o endereço do usuário cujo script Sieve está em execução. A especificação impõe esse limite para que o usuário não deduza se a mensagem chegou a outra pessoa. Para from, a contagem é zero quando o MAIL FROM do SMTP está vazio e um nos demais casos. Portanto, “contar destinatários” pode significar caixas postais visíveis no cabeçalho, endereços do envelope acessíveis ao script ou linhas de cabeçalho. O nome do teste não escolhe por si só.

Essa distinção muda também como as condições são combinadas. Uma contagem de endereços que inclui to e cc soma as duas quantidades de caixas postais. Se a regra desejada for “pelo menos três em To ou pelo menos três em Cc”, são necessárias duas comparações separadas dentro de anyof. A contagem combinada responderia a outra pergunta: “pelo menos três entre os dois campos?”. O exemplo da RFC mostra que dois endereços em To mais um em Cc satisfazem a soma de três, mas não satisfazem nenhum dos dois limiares separados de três.

A RFC 5231 não inventou os testes relacionais do Sieve. A RFC 3431, de 2002, já havia introduzido a extensão e os dois tipos de comparação; a RFC 5231 a substituiu. A versão posterior atualizou a referência do comparador para o registro de colação de protocolos de aplicação da RFC 4790, corrigiu exemplos, esclareceu quais elementos da RFC 2822 contam em COUNT e removeu uma exigência própria de aparar espaços depois que uma regra mais ampla entrou na especificação-base do Sieve. A IANA registra a capacidade relational como extensão da RFC 5231.

O alcance da extensão termina no teste. Ela não altera o KEEP implícito nem ações explícitas como fileinto, redirect ou reject. Um predicado pode escolher um ramo do script, mas não prova o que um servidor analisou, se executou o ramo corretamente ou onde a mensagem acabou entregue. A utilidade da precisão está nesse limite: é preciso conhecer a unidade, o comparador e a superfície de implementação.

Fontes