Avanti Indietro Indice

8. Procmail

8.1 Introduzione

Procmail è il programma che si occupa di smistare in diverse caselle le email che arrivano dai vostri account pop o direttamente dal sistema. E' forse il più complicato tra i programmi che dovrete configurare per la gestione della vostra posta elettronica, perciò qui ne sarà data una visione generale, rimandando ad una futura revisione dell'Howto altre finezze, man mano che mi vengono in mente e le sperimento. Prima di tutto alcune precisazioni su alcune convenzioni che uso: le caselle che contengono email in entrata io le chiamo per comodità "IN-qualchecosa", mentre quelle in uscita sono ovviamente "OUT-qualcosaltro", e le mailing-lists con "ML-ancoraqualcosa". I nomi di file sono interamente in minuscolo, mentre le directory iniziano con una lettera Maiuscola. I file accessori di .procmailrc finiscono con ".rc". Per mia comodità tengo di solito i file di configurazione ausiliari nelle directory di pertinenza del servizio, quindi i file richiamati da .procmailrc sono in $HOME/Mail/.Pm (mentre i file di Mutt sono in $HOME/Mail/.Mutt, i file di Slrn sono in $HOME/News/.Slrn, ecc). Il punto iniziale delle directory serve per nasconderle mentre sfoglio i miei spool con mutt o slrn, per mail e news. Per sicurezza TUTTA la posta in arrivo viene accodata in un file di backup (mostrerò anche come mantenere questo file in formato compresso gzip, per ridurre gli sprechi di spazi), verranno estratte dal flusso in ingresso le email provenienti da persone conosciute (per riinviarle in un file apposito), e quelle provenienti da mailing list (inviate in file univoci per ciascuna), lasciando le email rimanenti nello spool principale. In un prossimo aggiornamento dell'howto tratterò anche il filtraggio di UCE/UBE (Unsolicited Commercial/Bulk Email, cioè spam o posta indesiderata).

Il file di configurazione di Procmail (.procmailrc, nella vostra HOME) è suddiviso in due parti distinte: la prima è la configurazione vera e propria del programma, con variabili e path vari; la seconda invece è fatta dall'insieme delle regole che permettono di smistare la posta nei diversi file mailbox. In particolare, per la seconda parte, è più comodo suddividere le regole in file distinti (da includere nel file principale con la direttiva INCLUDERC), in base al loro uso: ad esempio un file con le regole per le mailing-list, un file per le email da amici, un file per lo spam, e così via. Questa comunque è la strada seguito in questo howto. Procmail processa messaggi nell'ordine in cui sono scritte le regole, all'interno del file .procmailrc o nei file in esso inclusi, e se non trova alcuna regola adatta accoda il messaggio allo spool principale (ecco perché, senza alcun file .procmailrc, i messaggi finiscono in /var/spool/mail/nomeutente, in genere mailbox di default di un sistema Linux). Le regole di procmail sono composte da espressioni regolari (la sintassi è nella sezione apposita), e possono essere divise in tre parti:

  1. una linea di inizio (con possibili flag), :0, seguito da una serie di flags che ne indicano il comportamento (alcune vengono spiegate nel seguito, le altre possono essere trovate in "man procmailrc"). Il secondo : indica che si vuole usare un lockfile sulla mailbox durante il processo, in modo da prevenire una possibile corruzione della stessa in caso di accesso contemporaneo da altri programmi (pensate alla possibile cancellazione di un messaggio con il vostro client mail mentre la mailbox è in fase di elaborazione da procmail). Dopo il : si può indicare un nome per il file di lock, altrimenti verrà generato in automatico da procmail.
  2. una o più condizioni, identificate da * come primo carattere
  3. una linea di smistamento, che può essere un file, una directory o una linea che inizia con | (pipe), che permette di inviare il messaggio in input ad un programma esterno per una qualche elaborazione, o ancora una linea che inizia per !, che permette di inviare una copia del messaggio a ciascun indirizzo email indicato dopo il !. Altre possibilità sono elencate in "man procmailrc".

8.2 File di configurazione

Questo è un file di configurazione abbastanza generico, può essere usato così com'è, perché le parti variabili (le regole di smistamento) sono contenute in altri file (elencati alla fine di questo) che vengono richiamati da questo principale:

=== file: .procmailrc ===


#directory
MAILDIR = $HOME/Mail   # ASSICURATI CHE ESISTA! Le email finiranno qui!
PMDIR = $MAILDIR/.Pm   # crea anche questa dir
PMSRC = $PMDIR

#varie
SHELL=/bin/sh
LINEBUF=8192
PATH=$HOME/bin:/bin:/usr/bin:/usr/local/bin
DEFAULT=$MAILDIR/IN.default   # mailbox di default per le email in entrata. Qui finiscono
    # le email che non sono elaborate o smistate prima da qualche regola adatta.
    # Se non definito, in generale le email finiscono in /var/spool/mail/nomeutente.
ADMINFOLDER=$MAILDIR/IN.admin   # mailbox per la posta di sistema, root, postmaster, ecc.
BULKFOLDER=$MAILDIR/IN.bulk   # mailbox per email da mailing list o Bcc:
FORMAIL=/usr/bin/formail   # path di formail, usato per processare alcune email

#log
VERBOSE = yes   # impostare a no dopo il debug
LOGABSTRACT = all   # produce log MOLTO estesi, impostare a no in seguito
LOGFILE = $PMDIR/pm.log   # file di log

# variabili utili (possono essere usate nelle regole per abbreviarne la scrittura,
# ad esempio come $NomeVariabile)
NL = "
" # nuova linea (un invio tra "")
WSPC = "        "   # blank: spazio + tab
SPC = "[$WSPC]"   # Regexp: spazio + tab
SPCL = "($SPC|$)"   # spazio o tab o nuova linea
NSPC = "[^$WSPC]"   # NON spazio o tab
s = $SPC   # abbreviazione: come in Perl \s
d = "[0-9]"   # una cifra -- Perl \d
w = "[0-9a-z_A-Z]"   # una parola alfanumerica -- Perl \w
W = "[^0-9a-z_A-Z]"   # NON una parola alfanumerica  -- Perl \W
a = "[a-zA-Z]"   # una parola, solo alfabetica

# imposta la variabile DATE come "mese_esteso-anno"
# attenzione, gli apici sono inversi, quindi ALT-GR più l'apice normale!
DATE = `date +%B-%Y`

#file .rc aggiuntivi
INCLUDERC = $PMDIR/general.rc
INCLUDERC = $PMDIR/spam.rc
INCLUDERC = $PMDIR/friends.rc
INCLUDERC = $PMDIR/lists.rc
INCLUDERC = $PMDIR/autoreply.rc
INCLUDERC = $PMDIR/other.rc

Per usare procmail, dovete istruire i programmi a richiamarlo. Per Fetchmail e Postfix potete trovare le istruzioni nelle relative sezioni di questo howto (si tratta di un rigo per parte), mentre per Sendmail, dovrete creare il file .forward nella vostra HOME (questo passo non è necessario se procmail è il gestore locale di default per lo smistamento, come nel caso di Redhat e distribuzioni derivate):

=== file: .forward ===


"| IFS=' ' && p=/usr/bin/procmail && test -f $p && exec $p -f- || exit 75 #mrshark"

Ricordatevi di sostituire a mrshark il vostro nome di login, e copiate esattamente come vedete, comprese virgolette e apici! In alcuni sistemi potrebbe essere richiesto che il file sia leggibile da tutti e la vostra directory HOME sia attraversabile: date i comandi


cd
chmod 644 .forward
chmod a+x .

Per controllare i file di log, potete usare lo script mailstat che viene fornito con procmail. Il suo uso è molto semplice, basta avviarlo fornendo come argomento il path del file di log (l'esempio seguente si riferisce alla configurazione impostata nel file .procmailrc precedente):

mailstat $HOME/Mail/.Pm/pm.log

Mailstat fornisce un rapporto sulle email arrivate e smistate a partire dalla volta precedente in cui è stato lanciato lo stesso mailstat: infatti esso dopo l'uso rinomina il file di log precedente con estensione .old e ne ricrea uno vuoto. Avete quindi anche un metodo per tenere a dimensioni accettabili il file di log, richiamando mailstat! Comunque, dopo aver testato procmail, è utile ridurre i log, impostando VERBOSE=no e LOGABSTRACT=no in .procmailrc.

8.3 File di regole (esempi)

=== file: general.rc ===


# corregge possibili header from errati
:0fhw:
| $FORMAIL -I "From " -a "From"
# emimina i messaggi doppi, copiandoli per sicurezza in un file apposito
:0Whc:msgid.lock
| $FORMAIL -D 8192 msgid.cache
:0a:
duplicati
# backup di tutte le email in ingresso
# N.B.: se si vuole un backup compresso, sostituire con quanto segue, senza # iniziale
#:0c:
#|gzip -9fc >> .backup.gz
:0c: 
.backup
:0: 
* ^TO_root
IN.admin

Note: Il flag f permette di considerare la pipe seguente come un filtro; il flag h impone che siano inviati anche gli header in pipe; il flag w impedisce che il file di lock sia rilasciato fino a quando il comando in pipe non ha concluso il suo processo. Il flag c permette di far proseguire l'email attraverso il flusso delle regole successive. Quindi in questo caso, essendo la prima regola, TUTTE le email saranno copiate per backup nel file indicato, dopo di che continueranno ad attraversare le altre regole, fino a incontrarne un'altra che effettuerà un confronto positivo (eventualmente facendola proseguire anch'essa con un flag c), e quindi togliendola dal flusso, o finiranno nello spool principale nel caso contrario. Il flag W ha lo stesso comportamento di w, ma non invia messaggi di avvertimento sullo schermo ("Program Failure"). Infine il flag a, permette di eseguire un comando SOLO se la regola IMMEDIATAMENTE precedente ha avuto esito positivo (quindi in questo caso se viene trovato un messaggio doppio, viene accodato a "duplicati"). "TO_" viene spiegato tra poco.

=== file: lists.rc ===


:0:
* ^TO_procmail@informatik.rwth-aachen.de
Lists/ML-procmail
:0:
* ^TO_vim@vim.org
Lists/ML-vim-$DATE

Note: TO_ è una macro predefinita di procmail che intercetta un indirizzo email fra gli header destinazione (To, Cc, Resent-To, ecc.). Va scritto ESATTAMENTE come lo vedete (* ^TO_indirizzo@email), rispettando spazi e maiuscole. Non inserite simboli < o >. Altre informazioni all'interno di man procmailrc.

Consigli: Inserite le regole per le mailing-list più trafficate all'inizio di lists.rc, in modo che i messaggi vengano elaborati prima e attraversino meno regole, velocizzando il processo.

Il secondo esempio invece suddivide le email anche in base a mese e anno (la variabile DATE è impostata in .procmailrc), il tutto in automatico (mese e anno sono quelli dello smistamento, NON dell'invio dagli autori alla mailing-list!) !

Infine, le email da mailing-list finiscono in una directory apposita: RICORDATEVI DI CREARLA!

=== file: spam.rc ===


:0:
* ^from.*qualche\.rompi\.balle@spamlandia\.com
/dev/null
:0:
* ^from.*sex
/dev/null

Note: lo spam finisce dritto dritto nel nulla! Notate l'uso di \. per indicare il punto (ricordate che il punto da solo significa QUALSIASI CARATTERE, quindi anche il punto stesso, ma non fidatevi, potrebbe avere effetti non voluti). /dev/null è un buco nero di sistema (hai capito il pinguino! ;-) ) che disperde qualsiasi cosa ci finisca dentro. Il secondo esempio invece l'ho messo per far vedere che non e' necessario mettere .* alla fine: è sottinteso, e in questo caso tutte le email che contengono la stringa sex vengono eliminate.

=== file: friends.rc ===


:0:
* ^from.*gino@pluto\.cxm
gino
:0:
* ^subject.*barzellett
{
    :0c:
    ! michele@yahoo.com
    :0:
    barzellette
}

Note: qui da notare l'uso delle parentesi graffe, che permettono di riunire comandi che devono agire su una stessa email. In questo caso di tutte le email che arrivano e che contengono la stringa barzellett (quindi sia barzelletta che barzellette) nel subject, ne viene generata una copia che viene inoltrata a michele@yahoo.com, dopo di che l'email finisce nella mailbox barzellette e la regola si conclude. In una prossima versione dell'howto vedremo come trattare in automatico anche gli attachment, le maledette email in HTML/MIME, e qualcos'altro che mi verrà in mente.

8.4 Sintassi delle espressioni regolari:

(N.B.: la sintassi proviene da quella del comando egrep)


Avanti Indietro Indice