# Sieve

Sieve é uma linguagem de programação que pode ser usada para filtragem de e-mail. Deve sua criação ao CMU Cyrus Project, criadores do servidor Cyrus IMAP.
A linguagem não está vinculada a nenhum sistema operacional ou arquitetura de correio específica. Requer o uso de mensagens compatíveis com RFC-2822, mas generaliza para outros sistemas que atendam a esses critérios. A versão atual da especificação básica do Sieve está descrita na RFC 5228, publicada em janeiro de 2008.

## Linguagem

Sieve é uma linguagem de programação orientada a dados, semelhante às linguagens de filtragem de e-mail anteriores, como procmail e maildrop, e às linguagens anteriores orientadas a linhas, como sed e AWK: especifica condições a serem correspondidas e ações a serem executadas na correspondência.
Isso difere das linguagens de programação de uso geral, embora seja altamente limitado – o padrão base não tem variáveis nem loops (mas permite ramificação condicional), evitando programas descontrolados que limitam a linguagem a operações simples de filtragem. Embora extensões tenham sido desenvolvidas para estender a linguagem para incluir variáveis e loops limitados, a linguagem ainda é altamente restrita e, portanto, adequada para executar programas desenvolvidos pelo usuário como parte do sistema de correio.
Há também um número significativo de restrições na gramática da linguagem, a fim de reduzir a complexidade da análise da linguagem, mas a linguagem também suporta o uso de vários métodos para comparar strings localizadas e é totalmente compatível com Unicode.
Embora o Sieve tenha sido originalmente concebido como uma ferramenta externa ao SMTP, o estende acidentalmente para permitir a rejeição no nível do protocolo SMTP.

## Uso

Os scripts Sieve podem ser gerados por um editor de regras baseado em GUI ou podem ser inseridos diretamente usando um editor de texto .
Os scripts são transferidos para o servidor de e-mail de maneira dependente do servidor. O protocolo ManageSieve (definido no RFC 5804) permite que os usuários gerenciem seus scripts do Sieve em um servidor remoto. Servidores de email com usuários locais podem permitir que os scripts sejam armazenados, por exemplo, em um arquivo .sieve nos diretórios pessoais dos usuários.

## História

A linguagem foi padronizada no (agora obsoleto) RFC 3028 de janeiro de 2001, de Tim Showalter.

## Extensões

O grupo de trabalho IETF Sieve atualizou a especificação base em 2008 (RFC 5228), e trouxe as seguintes extensões para o status de Norma Proposta:
* RFC 3894 – Cópia sem efeitos colaterais; permite que um script seja copiado entre caixas de correio sem interromper o script.
* RFC 5173 – Corpo; permite que um script teste o corpo de uma mensagem, não apenas seu cabeçalho.
* RFC 5183 – Ambiente; fornece acesso a informações sobre o interpretador Sieve e seu ambiente de sistema.
* RFC 5229 – Variáveis; permite que o script salve e recupere valores em variáveis.
* RFC 5230 – Férias; especifica uma ação para enviar uma resposta informando ao remetente que o destinatário pode estar ausente.
* RFC 5231 – Testes relacionais; define testes numéricos, para que um script possa testar um campo quanto a um valor numérico e testar o número de ocorrências de um campo.
* RFC 5232 – Flags IMAP4; permite que um script teste e defina as flags IMAP de uma mensagem.
* RFC 5233 – Subendereço; permite que um script teste subendereços no formato "usuário+detalhe@domínio.exemplo".
* RFC 5235 – Teste de Spam e de Vírus; permite que um script interaja com implementação.
* RFC 5260 – Extensões de Data e Índice.
* RFC 5293 – Editheader; permite que um script adicione e exclua campos de cabeçalho de mensagens.
* RFC 5429 – Rejeição; permite que mensagens sejam rejeitadas no nível LMTP/SMTP ou com um MDN ou DSN.
* RFC 5435 – Notificações; permite que um script acione notificações externas de e-mail.
* RFC 5436 – Notificações; permite que notificações sejam enviadas via protocolo mailto.
* RFC 5437 – Notificações via XMPP; especifica notificações via XMPP.
* RFC 5490 – Verificação; Status da caixa de correio e acesso a metadados da caixa de correio.
* RFC 5703 – Testes, Iteração, Extração, Substituição e Envoltório de Partes MIME
* RFC 5804 – Um Protocolo para Gerenciamento Remoto de Scripts Sieve
* RFC 6131 – Férias; adiciona a capacidade de especificar segundos em um período de férias.
* RFC 6558 – Conversão de partes MIME; permite que um script converta partes do corpo entre tipos MIME.
* RFC 6609 – Inclusão de Script; permite que um usuário inclua um script dentro de outro.

## Exemplo

Exemplo de um script Sieve: