Posts Tagged Dovecot Cyrus Sieve RFC 3028 5228 5229 5429
Os atuais MDAs e as linguagens de filtragem de e-mail (parte 3)
Posted by admin in Programação, Software Livre on April 20th, 2009
Continuando minha série de Posts sobre linguagens de filtragem de e-mail, escrevo enfim, sobre o Sieve, que é de longe, a mais importante das linguagens de filtragem, devido sua simplicidade, facilidade de aprendizado, e por ser um padrão de linguagem para filtragem de correio.
Assim como nos outros Posts sobre linguagens de filtragem de correio, este último também não tem intenção nenhuma de ensinar como configurá-los em seus servidores, mas sim, falar sobre a linguagem e mostrar alguns exemplos de scripts.
Sieve: Uma linguagem para filtragem de correio
Sieve é uma linguagem de scripts para filtragem de correio eletrônico que, dentre todas conhecidas, é a única que segue um padrão de implementação. Este padrão foi inicialmente definido na RFC3028 e atualizado pelas RFCs 5228, 5229 e 5429, ou seja, qualquer software de correio, pode criar sua própria implementação, e o mesmo script DEVE funcionar em qualquer um destes servidores.
Existem diversas implementações do padrão, mas as mais conhecidas pela comunidade Open-Source são sem dúvida, as implementações feitas pelo Cyrus IMAP Server e pelo Dovecot. Este segundo, usa o mesmo interpretador Sieve do Cyrus IMAP. A partir da versão 1.2 (ainda em Release Candidate) do Dovecot, o interpretador Sieve foi totalmente re-escrito.
A linguagem Sieve suporta a maioria das features que as outras linguagens já mostradas aqui, com uma exceção, que é a execução de comandos de sistema (vide Courier maildropfilter). O fato de não existir esta feature não deixa a linguagem mais fraca, mas sim mais segura, pois uma das razões que contribuiram para criação do padrão, é definir uma forma segura da manipulação de scripts pelo próprio usuário.
Sieve Scripts
Agora que já sabemos um pouco sobre a linguagem Sieve, vamos conhecer o que é possível fazer, e como podemos usar a linguagem Sieve para nos auxiliar.
A maioria das features do Sieve, podem ser incluídas em seu script através do comando “require”, assim, é possível que você carregue somente as funções que vai utilizar, agilizando o parsing do script.
Outro ponto importante é que a linguagem suporta internacionalização, ou seja, você pode escrever seus scripts em UTF-8. Nota que também existem extensões para o Sieve que também possuem RFCs relacionadas. Aqui, falaremos sobre algumas extensões, como “fileinto”, “vacation” e “regex”.
Exemplos de scripts:
Consideremos nossa mensagem de correio:
From: "Spammer"<spammer@viagra.com> Date: Sun, Apr 19 2009 18:36:49 -0300 X-Spam-Flag: Yes Subject: [ SPAM ] Testando um script Sieve Que tal testarmos alguns Sieve Scripts?
Vamos testar as seguintes simples condições, que são plausíveis no dia-a-dia:
- Verificar se a mensagem tem a tag [ SPAM ] e escolher uma ação a tomar;
- Auto-resposta;
- Verificar tamanho da mensagem e escolher uma ação a tomar;
- Verificar o remetente da mensagem e escolher uma ação a tomar;
1. Verificar se a mensagem tem a tag [ SPAM ] e escolher uma ação a tomar (descartar ou movê-la para uma outra pasta);
O primeiro passo é carregar os plugins a serem usados:
require [“fileinto”, “regex”];
Logo após, verificamos se a mensagem pussui tag SPAM ou o header “X-Spam-Flag: Yes”. Exemplificarei os dois casos:
Pelo header:
if header :contains “X-Spam-Flag” “Yes” { # move para a pasta SPAM fileinto “SPAM”; discard; }
Pelo Assunto via regex:
if header :regex “subject” “\[(.)?SPAM(.)?\]” { # neste exemplo, quero descartar a mensagem. discard; }
2. Auto-resposta de Férias
Novamente, o primeiro passo é carregar os plugins:
require [“fileinto”, “vacation”, “regex”];
Caso a mensagem for da lista “Postfix-BR”, não enviaremos a auto-resposta, mas armazenaremos em uma pasta específica.
if header :regex “list-id” “Grupo.*Postfix.*Brasil” { fileinto "Listas"; stop; } else { # não enviará novamente para o mesmo remetente mais de uma vez # até que se cumpra o período de 30 dias de férias. # Seu script tem que estar em UTF-8, por causa da acentuação vacation :days 30 “Estou de férias. Envie novamente para fulano@ciclano.com”; }
Auto-resposta sempre que receber um e-mail:
vacation :subject “Recebido” “Sua mensagem foi recebida com sucesso”;3. Verificar tamanho da mensagem e escolher uma ação a tomar
require “fileinto”; if size :over 5M { # salva na pasta BigMessages fileinto “BigMessages”; }
4. Verificar o remetente da mensagem e escolher uma ação a tomar
Neste exemplo, todas as mensagens vindas de “spammer@viagra.com” ou “Spammer” recebam a flag “Junk” e também a flag \\Deleted:
require "imapflags"; if addres :matches “from” “spammer@viagra.com” { setflag "\\Deleted"; addflag “Junk”; }
ou
require "imapflags"; if header :matches “from” “Spammer” { setflag "\\Deleted"; addflag “Junk”; }
Enfim, estes foram alguns simplíssimos exemplos de uso do Sieve. Espero que este pequeno Post te abra o “apetite” por esta pequena, mas eficiente linguagem de filtragem, que cresce a cada dia mais, e em breve, prevalecerá na maioria dos MTAs conhecidos do mercado.
Em breve, farei outro Post falando sobre o Dovecot ManageSieve, que é uma ótima ferramenta para gerenciar scripts Sieve e também detalharei como implementá-lo.
Até lá!
Referências
http://wiki.dovecot.org/LDA/Sieve: http://wiki.dovecot.org/LDA/Sieve
RFCs 3028, 5228, 5229 e 5429: http://ietfreport.isoc.org/rfc/rfc3028.txt, http://ietfreport.isoc.org/rfc/rfc5228.txt, http://ietfreport.isoc.org/rfc/rfc5229.txt, http://ietfreport.isoc.org/rfc/rfc5429.txt