Feb 7 2011

Sieve, il linguaggio per filtrare le email


by pandafunk

Sieve è un linguaggio che serve solamente a programmare dei filtri per le email: ha una grammatica molto semplice, pochi comandi, qualche estensione, non ha variabili e cicli, è compilato, è davvero molto sicuro proprio perché il suo ristrettissimo campo d’azione lascia ben pochi spazi alla scrittura di codice malizioso ed il suo migliore amico è deliver, l’LDA di Dovecot (ma va d’accordo anche con altri LDA).

Per chi non lo sapesse l’LDA (Local Delivery Agent) è l’ultimo processo per il quale passa una email, ovvero il processo che si occupa di memorizzarla sul filesystem dentro la giusta casella e nel corretto formato (mbox, maildir, etc, etc). Se l’LDA dispone di funzionalità di filtraggio potrà anche, in base a delle regole globali o per-utente, memorizzarla in una particolare cartella, scartarla o modificarla.

Dovecot, ad esempio, dispone di un plugin Sieve per programmare il suo LDA deliver al filtraggio delle email senza la necessità di dover aggiungere un ulteriore hop installando e configurando software tipo procmail o maildropfilter (le cui regole hanno una sintassi ben più ostica di Sieve!).

Per abilitarlo basta semplicemente aggiungere il plugin alla sezione lda di dovecot.conf:

protocol lda {
mail_plugins = sieve
}

Dovecot andrà a cercare l’esistenza del file .dovecot.sieve nella posizione in cui memorizzerà l’email, ovverlo la mail_location preconfigurata.

Vediamo un semplicissimo script sieve che sposta nella cartella CronDaemon tutte le email originate da Cron:

require "fileinto";

if header :matches "Subject" "Cron <root@*" {
fileinto "CronDeamon";
} else {
keep;
}

Ovviamente è anche possibile impostare script globali che vengono eseguiti solo quando manca lo script utente oppure script che vengono eseguiti prima o dopo lo script utente! Io ad esempio ho impostato uno script globale eseguito prima di quello dell’utente per spostare le email contrassegnate da spamassassin come spam nell’apposita cartella. L’ho messo in /var/mail/sieve.before ed indicato nella sezione plugin di dovecot.conf:

plugin {
sieve_before = /var/mail/sieve.before
}

e contiene

require "fileinto";

if header :contains "X-Spam-Flag" "YES" {
fileinto "Spam";
}

Come potete vedere è molto semplice e non bisogna essere dei guru delle espressioni regolari per smistare la posta!

Ecco qui qualche risorsa più approfondita e dettagliata: