11.4. Mail Delivery Agents

Red Hat Enterprise Linux include due MDA primari, Procmail e mail. Entrambe le applicazioni sono considerate Local Delivery Agent ed entrambi muovono le email dal file spool dell'MTA nella mailbox dell'utente. Tuttavia, Procmail fornisce un sistema robusto di filtraggio.

Questa sezione parla in modo dettagliato solo di Procmail. Per informazioni sul comando mail, consultare la propria pagina man.

Procmail consegna e filtra email nel vostro file spool dell'host locale. É potente, ampiamente utilizzato e non intrusivo. Procmail puó giocare un ruolo importante nella consegna di posta elettronica letta dalle applicazioni client.

Procmail può essere richiamato in molti modi. Ogni volta che un MTA posiziona una email nel file spool di posta, Procmail viene lanciato. Procmail, quindi, filtra e archivia per MUA e successivamente abbandona l'applicazione. In alternativa MUA potrebbe essere configurato per richiamare Procmail ogni volta che si riceve un messaggio, così che i messaggi siano archiviati nelle corrette mailbox. Per default, la presenza di /etc/procmailrc o di un .procmailrc (anche chiamato file rc)nella home directory dell'utente, richiamerà Procmail, nel caso in cui un MTA riceve un nuovo messaggio.

Le azioni eseguite da Procmail con i messaggi e-mail dipendono dalla corrispondenza del messaggio nei confronti di un insieme di condizioni o recipesnel file rc. Se un messaggio soddisfa i requisiti necessari, allora la email verrà posizionata in un file specifico, viene cancellato oppure processato.

Una volta avviato, Procmail legge il messaggio e-mail e separa la parte principale dall'informazione di testo. Successivamente Procmail và alla ricerca, per default, del file /etc/procmailrc e dei file rc nella directory /etc/procmailrcs, per le regole e le variabili di sistema dell'ambiente Procmail. Procmail va alla ricerca quindi di un file .procmailrc nella directory home dell'utente. Molti utenti creano anche dei file rc aggiuntivi per Procmail, per un riferimento all'interno del file .procmailrc nella loro directory hoe.

Per default, non esiste alcun file rc nella directory /etc/ e non vi sono nemmeno file .procmailrc nella directory home dell'untente. Per utilizzare Procmail, ogni utente deve creare un file .procmailrc con particolari variabili e regole per l'ambiente.

11.4.1. Configurazione di Procmail

I file di configurazione di Procmail contengono molte variabili importanti per l'ambiente. Tali variabili istruiscono Procmail sullo smistamento dei messaggi, sul suo comportamento nei confronti dei messaggi che non soddisfano le regole e così via.

Queste variabili di ambiente compaiono in genere all'inizio del file .procmailrc, nel seguente formato:

<env-variable>="<value>"

In questo esempio, <env-variable> è il nome della variabile e <value> definisce la variabile.

La maggior parte degli utenti Procmail non utilizza molte variabili, anche se molte delle più importanti sono già definite come valore di default. Spesso vi troverete di fronte alle seguenti variabili:

Altre importanti variabili di ambiente sono prelevate dalla shell, fra queste LOGNAME, che corrisponde al vostro nome di login, HOME, ovvero la posizione della vostra directory home e SHELL, la shell di default.

Spiegazioni esaurienti su tutte le variabili di ambiente e sui valori di default sono disponibili nella pagina man procmailrc.

11.4.2. Regole Procmail

Per molti nuovi utenti, la creazione delle regole rappresenta la parte più complicata per l'uso di Procmail. In un certo senso, questo è comprensibile, poiché le regole utilizzano espressioni regolari per far sì che i messaggi soddisfino i requisiti richiesti. Queste espressioni regolari identificano un particolare formato utilizzato per specificare gli attributi delle stringhe corrispondenti. Il costrutto delle espressioni regolari non è, tuttavia, complicato e la loro lettura ne rende ancora più semplice la comprensione. Inoltre, la consistenza del modo in cui le regole sono scritte, indipendentemente dalle espressioni regolari, facilita la comprensione del processo in corso. Per avere degli esempi, consultare la Sezione 11.4.2.5.

Le regole Procmail hanno le seguenti forme:

:0<flags>: <lockfile-name>

* <special-condition-character> <condition-1>
* <special-condition-character> <condition-2>
* <special-condition-character> <condition-N>

<special-action-character><action-to-perform>

I primi due caratteri di una regola Procmail sono i due punti e lo zero. Dopo lo zero possono anche esserci diverse flag per il controllo dell'attività di Procmail durante l'elaborazione di quella regola. La presenza dei due punti dopo la sezione <flags> indica che per quel messaggio sarà creato un file di blocco. L'utente dovrà specificare il nome del file nello spazio <lockfile-name>.

Una regola puó contenere diverse condizioni per corrispondere al messaggio. Se non vi sono condizioni, ogni messaggio sarà conforme alla regola. Le espressioni regolari sono comprese in alcune condizioni al fine di facilitare una corrispondenza con il messaggio. Se vengono utilizzate delle condizioni multiple, queste devono corrispondere tutte affinché sia possibile eseguire un'azione. Le condizioni sono controllate in base ai flag impostati nella prima riga delle regole. Speciali caratteri opzionali posizionati dopo il carattere * aggiungono un ulteriore controllo sulla condizione.

L'<action-to-perform>specifica l'azione intrapresa quando un messaggio soddisfa una delle condizioni. È consentita una sola azione per regola. In molti casi, qui viene utilizzato il nome di una mailbox per dirigere i messaggi conformi in quel file, smistando efficacemente la posta. Prima che venga specificata l'azione, possono essere utilizzati caratteri per azioni speciali. Consultare la Sezione 11.4.2.4 per maggiori informazioni sui caratteri per azioni speciali.

11.4.2.1. Regole di distribuzione e non distribuzione

L'azione eseguita se la regola si applica a un particolare messaggio determina se la regola stessa è considerata per il delivering o non-delivering. Una regola così detta delivering, contiene un'azione che scrive un messaggio su di un file, lo invia a un altro programma oppure lo inoltra a un altro indirizzo e-mail. Una regola chiamata non-delivering, copre qualsiasi altra azione, come ad esempio il nesting block. Il nesting block è un'azione contenuta tra parentesi graffe { } che designa azioni aggiuntive da eseguire sui messaggi che soddisfano le condizioni della regola. I nesting block possono essere gerarchizzati, garantendo così un maggiore controllo per l'identificazione e l'esecuzione di azioni sui messaggi.

Quando i messaggi corrispondono ad una regola di consegna o di 'delivering', Procmail esegue l'azione specifica e interrompe l'azione di confronto con le altre regole. I messaggi che corrispondono alle regole di non-delivering, continueranno ad essere confrontati con altre reegole.

11.4.2.2. Flag

I flag sono molto importanti per determinare se e come le condizioni della regola sono confrontate ad un messaggio. I seguenti esempi mostrano alcuni flag comunemente usati:

  • A — Specifica che la regola sarà usata solo se anche l'ultima regola applicata senza un flag A o a è stata applicata al messaggio.

  • a — Specifica che la regola sarà usata solo se anche l'ultima regola applicata senza un flag A o a è stata applicata al messaggio ed è stata completata con successo.

  • B — Analizza il corpo del messaggio e cerca il soddisfacimento delle condizioni.

  • b — Utilizza il corpo in ogni azione risultante, come la scrittura del messaggio su un file o il suo inoltro. Tale comportamento viene eseguito per default.

  • c — Genera una copia carbone della email. Ciò risulta utile con le regole di distribuzione, poiché l'azione richiesta può essere eseguita sul messaggio e la copia dello stesso può continuare a essere elaborata nei file rc.

  • D — Fa in modo che il confronto egrep preveda il riconoscimento dei caratteri maiuscoli. Per default, il processo di confronto non lo prevede.

  • E — Simile al flag A, tranne per il fatto che le condizioni in questa regola sono confrontate con il messaggio solo se la regola immediatamente precedente senza un flag E non soddisfa le condizioni. Ciò è paragonabile a un'azione else.

  • e — La regola viene confrontata con il messaggio, solo se l'azione specificata nella regola immediatamente precedente fallisce.

  • f — Utilizza pipe come filtro.

  • H — Analizza l'intestazione del messaggio e va alla ricerca del soddisfacimento delle condizioni. Ciò viene eseguito per default.

  • h — Utilizza l'intestazione in un'azione risultante. Ciò viene eseguito per default.

  • w — Indica a Procmail di aspettare il filtro specificato o il programma per terminare, ed eseguire il reporto sull'esito dell'operazione prima di considerare il messaggio già filtrato.

  • W — È identico a w ad eccezione che i messaggi "Program failure" sono soppressi.

Per un elenco dettagliato di flag aggiuntive, consultare la pagina man procmailrc.

11.4.2.3. Specificare un file di lock locale

I Lockfile sono molto utili perché evitano il verificarsi in contemporanea di processi di alterazione su alcuni messaggi. È possibile specificare un lockfile locale, posizionando un carattere : dopo ogni flag sulla prima linea della regola. In questo modo verrà creato un lockfile locale basato sul filename di destinazione che comprende tutto ciò che è stato impostato nella variabile globale dell'ambiente LOCKEXT.

In alternativa, è possibile specificare il nome del file di lock locale da utilizzare con la regola dopo i due punti.

11.4.2.4. Condizioni e azioni speciali

Caratteri speciali utilizzati prima delle condizioni delle regole e delle azioni di Procmail cambiano la loro interpretazione.

I seguenti caratteri possono essere utilizzati dopo il carattere * all'inizio di una linea di condizione delle regole:

  • ! — Inverte le condizioni, provocando un controllo solo se le condizioni non sono applicabili al messaggio.

  • < — Controlla se il messaggio è al di sotto di un determinato numero di byte.

  • > — Controlla se il messaggio superi un determinato numero di byte.

I seguenti caratteri sono utilizzati per eseguire azioni speciali:

  • ! — Indica a Procmail di inoltrare il messaggio all'indirizzo e-mail specificato

  • $ — Si riferisce a una variabile precedentemente impostata nel file rc. Questo carattere è utilizzato per impostare un comune mailbox cui faranno riferimento varie regole.

  • | — Avvia un programma specificato in modo da processare il messaggio.

  • { and } — Crea un blocco di nesting, usato per contenere regole aggiuntive da applicare ai messaggi che soddisfano le condizioni.

Se non sono utilizzati caratteri speciali all'inizio della linea d'azione, Procmail assume che quest'ultima stia specificando il mailbox sul quale scrivere il messaggio.

11.4.2.5. Esempi di regole

Procmail è un programma estremamente flessibile. Come conseguenza di questa flessibilità, tuttavia, vi è il fatto che comporre una regola per raggiungere un determinato scopo può risultare difficile per i non esperti.

Il modo migliore per sviluppare l'abilità di creare le condizioni della regola di Procmail è quello di comprendere delle espressioni regolari combinate con il controllo degli esempi creati da altri. La spiegazione approfondita delle espressioni regolari va oltre gli obbiettivi di questa sezione. La struttura delle regole di Procmail è molto più importante. Su internet sono disponibili esempi utili di regole Procmail (come ad esempio http://www.iki.fi/era/procmail/links.html). L'uso appropriato e l'adattamento delle espressioni regolari trovate negli esempi dipendono dalla comprensione della struttura delle regole Procmail. Specifiche informazioni introduttive alle espressioni regolari di base sono disponibili nella pagina man grep.

I seguenti esempi mostrano la struttura di base delle regole Procmail e possono fornire la base per la creazione di regole più complesse.

Le regole più elementari non contengono nemmeno le condizioni, come illustrato nell'esempio riportato di seguito.

:0:
new-mail.spool

La prima linea inizia la regola specificando che deve essere creato un lockfile locale senza indicarne il nome, lasciando che Procmail utilizzi il filename di destinazione e il LOCKEXT per nominarlo. Poiché non viene specificata alcuna condizione, ogni messaggio potrà soddisfare questa regola e, pertanto, sarà posizionato in un unico file di spool chiamato new-mail.spool e nella directory indicata dalla variabile di ambiente MAILDIR. I messaggi in questo file possono quindi essere visualizzati da un MUA.

Una regola di base, come questa, può essere posizionata alla fine di ogni file rc, in modo da dirigere i messaggi in una posizione di default.

Il seguente esemnpio corrisponde a messaggi provenienti da un indirizzo email specifico, che successivamente vengono eleiminati.

:0
* ^From: spammer@domain.com
/dev/null

In questo esempio, ogni messaggio inviato da spammer@domain.com viene immediatamente inviato nel dispositivo /dev/null, con una conseguente eliminazione.

CautelaAttenzione
 

Assicurarsi che una regola funzioni correttamente prima di spostare i messaggi che la soddisfano in /dev/null, poiché la cancellazione è definitiva. Se le condizioni della vostra regola trovano inavvertitamente dei messaggi da non sottoporre al controllo, e i suddetti messaggi vengono eliminati, diventerà difficile risolvere la regola.

La soluzione migliore è indirizzare l'azione verso un mailbox speciale che potrete controllare di volta in volta per cercare falsi positivi. Una volta certi che non vi siano messaggi controllati inavvertitamente, potete cancellare il mailbox e dirigere l'azione in modo da inviare i messaggi a /dev/null.

La seguente regola riceve i messaggi inviati da una mailing list particolare e li posiziona in una cartella particolare.

:0:
* ^(From|CC|To).*tux-lug
tuxlug

Qualsiasi messaggio inviato dalla mailing list tux-lug@domain.com sarà posizionato automaticamente nel mailbox tuxlug per il MUA. La condizione in questo esempio controllerà il messaggio se l'indirizzo e-mail della mailing list si trova sulle linee From, CC oppure To.

Consultate le risorse online di Procmail, disponibili su la Sezione 11.6 per regole più specifiche e potenti.

11.4.2.6. Filtri Spam

Dato che viene chiamato da Sendmail, Postfix, e Fetchmail quando si ricevono nuove email, Procmail puó essere usato come potente strumento contro spam.

Questo é particolarmente vero quando Procmail é usato in combinazione con SpamAssassin. Quando usati insieme, queste due applicazioni possono identificare velocemente email spam, separandole oppure eliminandole.

SpamAssassin usa l'analisi d'intestazione, di testo, blacklist, un database spam-tracking, e un'analisi spam self-learning Bayesian per identificare accuratamente e velocemente ed etichettare le email spam.

Il modo piú facile per un utente locale di usare SpamAssassin, é di posizionare la seguente riga vicino al limite superiore del file ~/.procmailrc:

INCLUDERC=/etc/mail/spamassassin/spamassassin-default.rc

Il /etc/mail/spamassassin/spamassassin-default.rc contiene una regola Procmail semplicein grado di attivare SpamAssassin per tutte le email in arrivo. Se una email viene determinata essere spam, viene etichettata nell'intestazione, e il titolo viene mostrato in questo modo:

*****SPAM*****

Il messaggio della email viene presentato con un riscontro corrente dell'elemento che ha causato il motivo per il quale la email é stata considerata spam.

Per archiviare una email etichettata come spam, puó essere usata una regola simile alla seguente:

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

Questa regola archivia tutte le email etichettate nell'intestazione, come spam in un mailbox chiamato spam.

Dato che SpamAssassin é uno script Perl, puó essere necessario su server molto occupati, di usare il demone SpamAssassin binario (spamd) e l'applicazione client (spamc). Configurando SpamAssassin in questo modo, tuttavia, richiede un accesso root per la host.

Per avviare il demone spamd, digitare il seguente comando come un utente root:

/sbin/service spamassassin start

Per avviare il demone SpamAssassin quando il sistema viene avviato, usare una utility initscript, come ad esempio il Strumento di configurazione dei servizi (redhat-config-services), per eseguirlo sul servizio spamassassin. Consultate la Sezione 1.4.2 per maggiori informazioni sulle utility iniscript.

Per configurare Procmail in modo da usare l'applicazione client SpamAssassin invece dello script Perl, posizionare le seguenti righe vicino alla parte superiore del file ~/.procmailrc. Per una configurazione dell'intero sistema, posizionarlo in /etc/procmailrc:

INCLUDERC=/etc/mail/spamassassin/spamassassin-spamc.rc