Archive for category Programação
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
Os atuais MDAs e as linguagens de filtragem de e-mail (parte 2)
Posted by admin in Programação, Software Livre on December 5th, 2008
Nesta segunda parte, venho mostrar aquele que é na minha opinião, o mais completo MDA para uso geral, O Courier-Maildrop.
À primeira vista, sei que este comentário parece tendencioso, mas independente de minha opinião pessoal, acho importante que se saiba as capacidades deste MDA antes de fazer sua escolha.
Novamente contarei um pouco de história, falando sobre o seu crescimento e amadurecimento. Trago também novos exemplos para mostrar aquilo que é o mínimo que a maildropfilter pode fazer.
Courier-Maildrop, o canivete suiço
Este MDA Surgiu em 1998, inicialmente como parte do Courier Mail Server, mas logo teve seu release standalone. Com o passar dos anos, foi se tornando um dos MDAs mais flexíveis e logo tornou-se também um dos mais usados, tendo como concorrente direto o vdeliver (parte do software vmailmgr, o qual não vou abordar) em servidores com Qmail. Com o advento do Postfix, teve um significante aumento em sua difusão, pois trata-se de uma alternativa eficaz para usuários virtuais. Durante uns bons anos foi considerada o melhor para este fim, devido sua flexibilidade. Em relação à sua linguagem para filtros, a maildropfilter é uma linguagem extremamente flexível e poderosa. Possui uma sintaxe muito parecida com Perl ou PHP e também características do POSIX Shell Script, e por isso podemos considerá-la extremamente intuitiva e com uma suave curva de aprendizado.
A maildropfilter não é somente uma linguagem que possibilita criar regras para filtragem de mensagens, mas sim, além dessa que é sua funcionalidade básica, é um processador de regras de negócio. Diferentemente do procmail e o Dovecot LDA (que veremos no próximo artigo), o maildrop é o único que por possuir realmente uma linguagem de programação embutida, pode proporcionar algo assim.
Da mesma forma que os outros MDAs, o maildrop inicia seu trabalho a partir de expressões regulares (PCRE) e finaliza seu trabalho quando encontra a declaração “to”. Inicia com diversas variáveis pré-definidas, e entre elas algumas importantes são: DEFAULT (Mailbox padrão para entrega. Para utilizar maildir, “Maildir/”), FROM, LOGNAME e SENDMAIL. Muitas outras estão disponíveis vide “man maildropfilter”.
Uma feature extremamente útil na minha opinião, é a capacidade de executar comandos de sistema. A maildropfilter o faz de duas formas: Através do comando xfilter ou da forma Unix like de receber saída de comandos, com as aspas invertidas. Ex. DIR=`ls`.
Podemos considerar a maildropfilter é uma linguagem completa, pois ela conta com os condicionais if e else, os laços while, for e foreach, operadores lógicos e bitwise e operadores de comparação, semelhantes ao POSIX Shell e Perl. Além disso, conta com comandos específicos para ajudar na filtragem. Veremos estes comandos nos exemplos à seguir.
Exemplos:
1. Filtrar todas as mensagens com Assunto ***SPAM*** para a pasta Mala Direta:
1 2 3 4 5 6 | if ( /^Subject:.*SPAM.*/ ) { # Ao processar com sucesso o to o maildrop sai com EX_OK. # Em caso de erro EX_TEMPFAIL. to “$MAILDIR/.Mala Direta/” } |
2. Se a mensagem vier de “Grupo Email” verificar o assunto e se caso for “Teste do Maildrop” mover para a pasta “Grupo Email”:
1 2 3 4 5 6 7 | if(/^From:.*GruposEmail.*/) { if(/^Subject:.*Teste.do.Maildrop.*/) { to “$MAILDIR/Grupo Email/” } } |
3. Verificar no arquivo .config se o usuário possui o serviço de filtro de mensagens, e caso positivo, executar os filtros deste usuário e logar que será executado o filtro:
1 2 3 4 5 6 7 8 9 10 11 | # seta local do logfile. Usuário rodando maildrop # precisa de permissão de escrita no arquivo. logfile “/var/log/maildrop.log” # o comando lookup procura por patterns dentro de arquivos. if(lookup(/^filterpref/, $HOME/.config)) { # grava no logfile. log “Este login possui filtros, executando” include $HOME/.myfilters } |
4. Verifica se o remetente está na blacklist
1 2 3 4 5 6 7 8 9 | # a maildropfilter possui pattern matching, sendo assim você # pode usar o resultado da expressão regular no seu script. if(/^From:s*(.*)/ && lookup( $MATCH1, “blacklist.txt”) ) { # extrai o endereço RFC2822 do resultado da expressão. ADDR=getaddr($MATCH1) log “maildrop: $ADDR is on blacklist (dropped)” exit } |
Muitos outros exemplos e a documentação completa do maildrop e da maildropfilter podem ser conseguidas via o comando “man maildrop” e “man maildropex”, ou na página do Courier-Maildrop.
Como visto nos exemplos, o maildrop é um filtro avançado e o mais indicado quando é necessário colocar regras de negócio no procedimento de entrega dos e-mails. Lógicamente, se a sua única intenção é efetuar filtragens simples, você pode optar por outro MDA menos robusto. Isto também não significa que nestes casos você não deva o usar, pois a escolha também depende da combinação usada na instalação de seu servidor. Normalmente, se você utiliza Courier-IMAP, a melhor escolha é sempre o maildrop.
Espero que este artigo também tenha sido esclarecedor e como é de praxe, se você quiser conhecer mais sobre este MDA, acesse o site do Courier-Maildrop e também leia suas páginas de manual. Te garanto que é a melhor leitura pra quem quer aprender sobre este cara.
No próximo artigo, falarei sobre o Dovecot LDA, esse que é a coqueluxe do momento, e também sobre a história do Sieve. Até lá!
Bibliografia
maildrop documentation: http://www.courier-mta.org/maildrop/documentation.html
Páginas do manual: man maildropfilter, man maildropex
Os atuais MDAs e as linguagens de filtragem de e-mail.
Posted by admin in Programação, Software Livre on November 29th, 2008
Existem vários assuntos interessantes dentro do universo dos servidores de e-mail, um deles é a concorrência entre diversos tipos de MDA (mail delivery agent). Frequentemente este assunto é motivo de boas discussões, e nessas discussões a pergunta que se sobressai é: Qual a melhor escolha entre por exemplo o Courier-Maildrop, Dovecot LDA ou Procmail?
O intuito deste texto não é concluir qual o melhor MDA do momento, mas sim mostrar suas diferenças, explicar um pouco sobre a linguagem que cada MDA implementa e, quem sabe, poder ajudar o leitor a decidir qual é o mais adequado para uso em seu ambiente. Farei uma abordagem cronológica, ou seja, dos três escolhidos, do primeiro a surgir até o mais atual, e neste primeiro post vou falar um pouco sobre o já bastante conhecido Procmail.
Um overview sobre o Procmail.
Dos agentes de entrega escolhidos, o Procmail é o mais antigo deles. Teve seu release 1.0 em 1990, e inicialmente seu uso mais comum foi como MDA para o Sendmail. Em relação à linguagem embutida no Procmail para processamento das mensagens, podemos dizer que foi de certa forma influenciada por este atrelamento com o Sendmail, pois quando olharmos um arquivo “procmailrc”, é provável que tomaremos um pequeno susto do tipo daquele que tomávamos ao ler um “sendmail.cf”. Apesar de não ser difícil de trabalhar com o procmail, a sintaxe de sua linguagem não pode ser considerada intuitiva ao primeiro olhar.
O procmail trabalha principalmente com processamento de mensagens através de expressões regulares, no caso do procmail, seguindo o padrão POSIX. O procmail trabalha com um conceito chamado “recipe”, e cada recipe por padrão deve ser iniciado pelo caracter “:” (dois pontos) e o digito 0 (zero). A sintaxe exata do procmail deve seguir o seguinte padrão:
:0[ flags] [: [local lockfile name] ]<uma ou mais condições (por linha) > <ação>
FLAGS
As flags principais do procmail são:
H - processa o header;
B - processa o body;
D - inicia o recipe em case sensitive mode;
c - faz uma cópia carbono;
ACTIONS
São simples ações executadas pelo procmail:
! - encaminha a mensagem para um endereço específico;
| - Envia a saída (stdout) para determinado programa;
{ - inicia um próximo bloco de “recipes” (necessita ao mínimo um espaço após o caracter);
O procmail também permite que sejam extraídas diversas variáveis de ambiente que podem ser usadas como facilitadores dentro de seu filtro, principalmente as varíaveis LOGNAME, SHELL, HOME, HOST (todas são auto-explicativas).
Abaixo, mostrarei alguns exemplos de uso do procmail. Exemplos mais complexos estão disponíveis através do simples comando “man procmailex”.
Exemplos:
1. Separa todas as mensagens com assunto: ***SPAM*** na pasta Mala Direta:
1 2 | # neste caso, a pasta é formato mbox. Maildir necessita do “/” :0H ^Subject:.*SPAM.* Mala Direta |
2. Efetuda cópia carbono das mensagens com assunto “Todos” para o destinatário foo@bar:
1 2 3 4 | :0H ^Subject:.*Todos { :0 c ! foo@bar } |
3. Auto-resposta:
1 2 3 4 5 | :0 c | (formail -A”Subject: Mensagem recebida”; echo “Sua mensagem foi recebida, logo entrarei em contato!”; echo “--”; cat $HOME/.signature ) | $SENDMAIL -oi -t |
Como vimos nestes exemplos, o procmail é uma ótima solução para filtragem simples. Sua linguagem apesar de incomum, é provavelmente a de mais rápido processamento por não necessitar de análise léxica complexa. E uma informação interessante sobre procmail: Sim! É possível usá-lo com usuários virtuais! Só que infelizmente, ele não te dá uma flexibilidade tão grande, visto que não suporta nenhum tipo de base de usuários, funcionando basicamente com dados disponíveis através de variáveis de ambiente.
Por ora conhecemos um pouco do Procmail. Se esse pequeno artigo te fez se interessar por este MDA, o primeiro passo é descobrir mais sobre ele. Informações sobre ele podem ser conseguidas nas páginas do manual, ou então no site do procmail.
No próximo post vou abordar o MDA Courier-Maildrop. Novamente um pouco de história e exemplos de uso deste que é o mais completo MDA e pode ser considerado o canivete suiço no mundo da filtragem de e-mail.
Referências bibliográficas
procmail.org - http://www.procmail.org/ - Acesso em 28/11/2008.
Paginas do manual - (man procmail, man procmailex) – 29/11/2008.