Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Gestire la posta con Procmail

Breve guida al funzionamento e all'uso di Procmail, il potente gestore della posta elettronica per sistemi Linux e Unix
Breve guida al funzionamento e all'uso di Procmail, il potente gestore della posta elettronica per sistemi Linux e Unix
Link copiato negli appunti

Procmail è un programma in grado di smistare la posta indirizzata agli utenti di un mail server basato su un sistema operativo Unix-like. Fondamentalmente utilizza alcune espressioni regolari per eseguire operazioni di gestione di messaggi di posta elettronica: salvataggio di un messaggio in una particolare posizione, inoltro ad un altro indirizzo o elaborazione mediante un programma esterno. Solitamente viene definito come un MDA, Mail Delivery Agent, o un LDA, Local Delivery Agent e riceve i messaggi da un MTA, Mail Tranfer Agent, ad esempio Sendmail, Qmail o Postfix che si affida ad esso per lo smistamento.

La home page del software presenta l'elenco dei mirror da cui scaricarlo anche se, con buona probabilità, lo troverete già installato sulla vostra macchina. Per verificarlo usate il comando:

# which procmail
/usr/bin/procmail

che, in caso positivo, restituirà il path del programma come mostrato nell'esempio. Normalmente Procmail viene distribuito insieme a Formail, un tool che permette di processare i messaggi già recapitati in una mailbox. Per questioni di spazio quest'articolo prenderà in considerazione solo il primo.

Il comportamento di Procmail è determinato da un file di configurazione contenente le regole da applicare ai messaggi, in gergo recipes, letteralmente 'ricette'. Tale file può essere globale, agendo sulla posta di tutti gli utenti, oppure limitato ad uno specifico utente. Se sono presenti entrambi, prima viene esaminato il file globale e poi quello personale. Onde evitare lo scompiglio dell'intero sistema di posta conviene procedere facendo esperimenti su di un singolo utente.

Le indicazioni che seguono si riferiscono ad un sistema basato su Fedora Core 5, con Sendmail configurato per usare procmail come MDA e che utilizza mailbox nel formato unix tradizionale mbox. Gli adattamenti ad altri MTA o a mailbox di formato diverso dovrebbero comunque essere minimi e ben documentati in Rete. A questo proposito Procmail Quick Start, di Nancy McGough, risulta un documento imperdibile sia per la qualità delle informazioni, che per i numerosi link. Buona parte dell'approccio e delle strategie di seguito descritte nascono dall'analisi del citato documento e dei link in esso contenuti, confortati da prove sul campo. Anche le Procmail FAQ costituiscono un buon punto di partenza. Ma vediamo subito un primo approccio al programma.

Lanciando il seguente comando:

# procmail -v

otteniamo numerose informazioni, per brevità riportiamo solo le più importanti per i nostri scopi:

procmail v3.22 2001/09/10
..........................
Default rcfile:         $HOME/.procmailrc
        It may be writable by your primary group
Your system mailbox:    /var/mail/ermanno

Innanzitutto si noti la versione del software che stiamo utilizzando, elemento importante se cerchiamo documentazione. Poi ci viene suggerita la posizione ed il nome del file di configurazione per l'utente corrente. Il cosiddetto rcfile dovrà trovarsi nella sua home directory e dovrà chiamarsi .procmailrc. Da ultimo vediamo la posizione della mailbox (/var/mail/ermanno) ovvero il file che di default viene aggiornato alla ricezione di un'email.

Per determinare la posizione dell'eventuale file di configurazione globale (solitamente /etc/procmailrc o /usr/local/etc/procmailrc) consultiamo la pagina del manuale:

# man procmail

Poi ricerchiamo la parola "global" digitando /global. Dovremmo trovare una riga simile a:

/etc/procmailrc        initial global rcfile

Poiché abbiamo stabilito di testare il software su di un singolo utente creiamo, se non esiste, il file ASCII .procmailrc nella sua home directory. Creiamo inoltre una directory di lavoro chiamata Procmail, ricordandoci di cambiar owner e gruppo ad entrambi se stiamo operando con i privilegi di root.

Le variabili d'ambiente

Cominciamo con il definire nel nostro file di configurazione alcune variabili d'ambiente. Tra queste ve ne sono alcune predefinite per le quali, ove possibile, conviene mantenere inalterati i valori di default. Per l'elenco completo consultate la manpage procmailrc(5). Il simbolo "#" individuerà come al solito i commenti:

#specifichiamo la shell (in questo caso Bourne
#Shell) fondamentale se richiamiamo altri programmi
SHELL=/bin/sh

#non e' una variabile predefinita
#quindi il nome e' ininfluente
#ci servira' come directory di lavoro
PMDIR=$HOME/Procmail      

#definendo un file di log
#implicitamente diciamo a Procmail
#di loggare le operazioni
LOGFILE=$PMDIR/mylog

#inseriamo una riga vuota per 
#ogni messaggio di log per rendere
#piu' leggibile il file
LOG="
"

#attiviamo un logging 'verboso'
#utile per il debug, poi conviene commentarla
VERBOSE=yes

#posizione in cui risiedono le cartelle
#di posta personali, non la mailbox vera
#e propria
MAILDIR=$HOME/mail
 

Ai commenti si può solo aggiungere una precisazione su $MAILDIR, solitamente è una sottodirectory della home directory: dall'istruzione di assegnazione in poi diventa la directory corrente di Procmail e tutti i path relativi faranno riferimento ad essa.

A questo punto non resta che inserire le regole di filtraggio, nel farlo conviene però adottare un approccio modulare, isolando gruppi di regole correlate in file esterni ed includendoli nel file principale. Questo ne consente una più semplice gestione e manutenzione oltre a fornire un immediato sistema di plug/unplug commentando o meno la riga corrispondente.

Aggiungiamo in coda al file istruzioni del tipo:

INCLUDERC=$PMDIR/rc.amici
INCLUDERC=$PMDIR/rc.liste

dove rc.amici e rc.liste rappresentano due file contenenti le regole. Come si nota facciamo riferimento, mediante la variabile $PMDIR, alla directory ~/Procmail, dove avremo cura di inserire tali file. I messaggi che non troveranno corrispondenza con le regole predisposte verranno normalmente recapitati nella INBOX di default.

Le ricette

La sintassi basilare delle regole è la seguente:

:0 [flags] [ : [lockfile] ]
* condizione1
* condizione2
...........
* condizioneN
azione

Il simbolo :0 (zero) indica l'inizio di una regola.

Opzionalmente possiamo utilizzare un flag che indica il comportamento da adottare, ad esempio H specifica di ricercare nelle intestazioni del messaggio (default), B nel corpo, c di creare una copia dell'email per fornirla alle successive regole e così via. L'elenco completo lo trovate nella documentazone del programma.

Ancora opzionali sono i successivi ':' (due punti) che richiedono la creazione di un file di lock per evitare che più processi modifichino contemporaneamente il file specificato nella regola; eventualmente possiamo indicarne il nome, diversamente Procmail si arrangia da solo.

Il carattere '*' (asterisco) determina l'inizio di una condizione ovvero un'espressione regolare perfettamente compatibile con egrep (extended regular expressions). Verranno ignorati eventuali spazi iniziali e finali. Tra le condizioni, se più di una, viene effettuato un AND logico. In proposito potete consultare Regular Expressions Procmail Mail Filtering Syntax.
Infine viene indicata l'azione da compiere al verificarsi delle condizioni.

Lasciamo ora i formalismi ed analizziamo qualche regola per meglio comprenderne il funzionamento:

:0:
* ^From:.*ermanno@dominio.it
amici

La prima riga inizia la ricetta (:0) e richiede un lock (:).

Nella seconda compare una condizione (*) mediante la quale cerchiamo nell'email un header che inizi (^) con la stringa "From:", seguita da un qualsiasi carattere ad esclusione di newline (.), ripetuto zero o più volte (*). Ancora seguito dalla stringa "ermanno@dominio.it" in cui si nota l'escape del punto (.), avendo tale carattere un significato speciale.

La terza riga rappresenta l'azione da intraprendere nel caso in cui la regola sia soddisfatta, ovvero il salvataggio nella mailbox amici. Tale mailbox, se non esistente, verrà creata da Procmail (meglio lasciare al programma tale compito) in ~/mail, come da impostazione della variabile $MAILDIR. Analogamente verrà creato o, se esistente, aggiornato il file di log mylog in ~/Procmail. Un altro esempio alla pagina successiva.

:0
* ^Subject:.*test
{
:0 c
! ermanno@miodominio.it

:0:
tests
}

La prima parte risulta simile all'esempio precedente solo che analizza l'header che inizia con "Subject:" cercando la sequenza "test". Di seguito vengono intraprese due azioni ({ }): la prima prevede l'inoltro dell'email ad un particolare indirizzo. Il flag c crea una copia del messaggio per la regola successiva, inoltre, non dovendo eseguire operazioni di scrittura, abbiamo omesso il lock (:). Con la seconda azione il messaggio viene salvato nella mailbox tests.

La regola seguente risulta un po' più complessa e permette di utilizzare SpamAssassin per catturare lo spam tramite Procmail. Dipende dalla particolare installazione del filtro antispam e dalla sua configurazione quindi non è garantito il funzionamento su qualsiasi sistema.

:0fw: spamassassin.lock
* < 256000
| spamc -f

:0:
* ^X-Spam-Status: Yes
IN-spam

Notiamo il flag f per utilizzare la pipe come filtro, e w (wait) per attendere l'uscita dal filtro controllandone lo stato. Vengono analizzati solo i messaggi inferiori ai 250 KB, per non caricare il sistema, i quali vengono mandati in ingresso a spamc il client di spamd. Se il messaggio viene catalogato come spam, SpamAssassin aggiunge l'header "X-Spam-Status: Yes". Con la regola successiva si verifica la presenza di tale header ed in caso positivo il messaggio viene salvato nella mailbox IN-spam.

Se volessimo direttamente eliminare lo spam potremmo sostituire IN-spam con /dev/null oppure, artificio comune, impostare la variabile HOST con un hostname diverso da quello della nostra macchina ad esempio così: {HOST = addio.baby}.

Conclusioni

Quanto abbiamo descritto fornisce solo l'idea di ciò che si può fare con Procmail la cui potenza, ma anche difficoltà, deriva dall'applicazione delle espressioni regolari. Un utilizzo comune consiste nel gestire lo smistamento della posta dei propri utenti in accoppiata con un server IMAP che consenta loro l'accesso alle varie cartelle. Ad esempio si possono configurare varie mailing-list sfruttando l'header "List-ID:" (usato da Majordomo e Mailman) o la macro "TO_" che analizza tutti gli header che specificano un destinatario come To, Cc, etc.. Concludendo gli unici limiti risultano la vostra fantasia ed il vostro ingegno.

Ti consigliamo anche