Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > f1098342ec4a2b28475e34123ce17201 > files > 967

howto-html-it-9.1-0.5mdk.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
 <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
 <TITLE>Quick&amp;Easy Configuration HOWTO: Procmail</TITLE>
 <LINK HREF="Quick-Easy-Configuration-HOWTO-9.html" REL=next>
 <LINK HREF="Quick-Easy-Configuration-HOWTO-7.html" REL=previous>
 <LINK HREF="Quick-Easy-Configuration-HOWTO.html#toc8" REL=contents>
</HEAD>
<BODY>
<A HREF="Quick-Easy-Configuration-HOWTO-9.html">Avanti</A>
<A HREF="Quick-Easy-Configuration-HOWTO-7.html">Indietro</A>
<A HREF="Quick-Easy-Configuration-HOWTO.html#toc8">Indice</A>
<HR>
<H2><A NAME="s8">8. Procmail</A></H2>

<H2><A NAME="ss8.1">8.1 Introduzione</A>
</H2>

<P>Procmail &egrave; 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&ugrave; complicato tra i programmi che dovrete configurare per la gestione della
vostra posta elettronica, perci&ograve; qui ne sar&agrave; 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&agrave;
&quot;IN-qualchecosa&quot;, mentre quelle in uscita sono ovviamente &quot;OUT-qualcosaltro&quot;,
e le mailing-lists con &quot;ML-ancoraqualcosa&quot;. I nomi di file sono interamente
in minuscolo, mentre le directory iniziano con una lettera Maiuscola. I file
accessori di .procmailrc finiscono con &quot;.rc&quot;. Per mia comodit&agrave; 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&ograve;
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&ograve;
anche il filtraggio di UCE/UBE (Unsolicited Commercial/Bulk Email, cio&egrave; spam
o posta indesiderata). 
<P>Il file di configurazione di Procmail (.procmailrc, nella vostra HOME)
&egrave; suddiviso in due parti distinte: la prima &egrave; la configurazione vera e propria
del programma, con variabili e path vari; la seconda invece &egrave; fatta dall'insieme
delle regole che permettono di smistare la posta nei diversi file mailbox.
In particolare, per la seconda parte, &egrave; pi&ugrave; 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&igrave; via. Questa comunque
&egrave; 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&eacute;, 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 &egrave;
nella sezione apposita), e possono essere divise in tre parti:
<P>
<OL>
<LI>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 &egrave; in fase di elaborazione da procmail). Dopo
il : si pu&ograve; indicare un nome per il file di lock, altrimenti verr&agrave; generato
in automatico da procmail.</LI>
<LI>una o pi&ugrave; condizioni, identificate da * come primo carattere</LI>
<LI>una linea di smistamento, che pu&ograve; 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&agrave; sono elencate in "man procmailrc".</LI>
</OL>
<H2><A NAME="ss8.2">8.2 File di configurazione</A>
</H2>

<P>Questo &egrave; un file di configurazione abbastanza generico, pu&ograve; essere usato
cos&igrave; com'&egrave;, perch&eacute; le parti variabili (le regole di smistamento) sono contenute
in altri file (elencati alla fine di questo) che vengono richiamati da questo
principale:
<P>=== file: .procmailrc ===
<P>
<HR>
<PRE>
#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 = &quot;
&quot; # nuova linea (un invio tra &quot;&quot;)
WSPC = &quot;        &quot;   # blank: spazio + tab
SPC = &quot;[$WSPC]&quot;   # Regexp: spazio + tab
SPCL = &quot;($SPC|$)&quot;   # spazio o tab o nuova linea
NSPC = &quot;[^$WSPC]&quot;   # NON spazio o tab
s = $SPC   # abbreviazione: come in Perl \s
d = &quot;[0-9]&quot;   # una cifra -- Perl \d
w = &quot;[0-9a-z_A-Z]&quot;   # una parola alfanumerica -- Perl \w
W = &quot;[^0-9a-z_A-Z]&quot;   # NON una parola alfanumerica  -- Perl \W
a = &quot;[a-zA-Z]&quot;   # una parola, solo alfabetica

# imposta la variabile DATE come "mese_esteso-anno"
# attenzione, gli apici sono inversi, quindi ALT-GR pi&ugrave; 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
</PRE>
<HR>
<P>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 &egrave; necessario se procmail &egrave; il
gestore locale di default per lo smistamento, come nel caso di Redhat e distribuzioni
derivate):
<P>=== file: .forward ===
<P>
<HR>
<PRE>
&quot;| IFS=' ' &amp;&amp; p=/usr/bin/procmail &amp;&amp; test -f $p &amp;&amp; exec $p -f- || exit 75 #mrshark&quot;
</PRE>
<HR>
<P>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
<P>
<HR>
<PRE>
cd
chmod 644 .forward
chmod a+x .
</PRE>
<HR>
<P>Per controllare i file di log, potete usare lo script mailstat che viene
fornito con procmail. Il suo uso &egrave; 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):
<P>mailstat $HOME/Mail/.Pm/pm.log
<P>Mailstat fornisce un rapporto sulle email arrivate e smistate a partire
dalla volta precedente in cui &egrave; 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,
&egrave; utile ridurre i log, impostando VERBOSE=no e LOGABSTRACT=no in .procmailrc.
<H2><A NAME="ss8.3">8.3 File di regole (esempi)</A>
</H2>

<P>=== file: general.rc ===
<P>
<HR>
<PRE>
# 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 &gt;&gt; .backup.gz
:0c: 
.backup
:0: 
* ^TO_root
IN.admin
</PRE>
<HR>
<P>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&agrave; 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.
<P>=== file: lists.rc ===
<P>
<HR>
<PRE>
:0:
* ^TO_procmail@informatik.rwth-aachen.de
Lists/ML-procmail
:0:
* ^TO_vim@vim.org
Lists/ML-vim-$DATE
</PRE>
<HR>
<P>Note: TO_ &egrave; 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 &lt; o &gt;. Altre informazioni all'interno di man procmailrc.
<P>Consigli: Inserite le regole per le mailing-list pi&ugrave; trafficate all'inizio
di lists.rc, in modo che i messaggi vengano elaborati prima e attraversino
meno regole, velocizzando il processo.
<P>Il secondo esempio invece suddivide le email anche in base a mese e anno
(la variabile DATE &egrave; impostata in .procmailrc), il tutto in automatico (mese
e anno sono quelli dello smistamento, NON dell'invio dagli autori alla mailing-list!)
!
<P>Infine, le email da mailing-list finiscono in una directory apposita: RICORDATEVI
DI CREARLA!
<P>=== file: spam.rc ===
<P>
<HR>
<PRE>
:0:
* ^from.*qualche\.rompi\.balle@spamlandia\.com
/dev/null
:0:
* ^from.*sex
/dev/null
</PRE>
<HR>
<P>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 &egrave; 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: &egrave; sottinteso, e in questo
caso tutte le email che contengono la stringa sex vengono eliminate.
<P>=== file: friends.rc ===
<P>
<HR>
<PRE>
:0:
* ^from.*gino@pluto\.cxm
gino
:0:
* ^subject.*barzellett
{
    :0c:
    ! michele@yahoo.com
    :0:
    barzellette
}
</PRE>
<HR>
<P>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&agrave; in mente.
<H2><A NAME="ss8.4">8.4 Sintassi delle espressioni regolari:</A>
</H2>

<P>(N.B.: la sintassi proviene da quella del comando egrep)
<P>
<UL>
<LI>^ inizio della linea</LI>
<LI>$ fine della linea</LI>
<LI>ogni singolo carattere corrisponde a s&egrave; stesso (se si tratta di un carattere
speciale, per fare il confronto lo si deve far precedere da \ , quindi:
\?, \+, \{, \|, \(, \), ecc.</LI>
<LI>. qualsiasi carattere eccetto il fine-linea</LI>
<LI>[12a-e-] un carattere tra quelli racchiusi tra parentesi. In
questo caso pu&ograve; essere: 1, 2, a, b, c, d, e, -. Gruppi consecutivi di caratteri
si identificano con il primo, seguito da - e dall'ultimo (a-e=abcde). Se il
primo carattere &egrave; ^, si intende qualsiasi carattere ESCLUSI quelli tra parentesi.
Per includere il simbolo ] lo si deve mettere per primo, mentre per inserire
il simbolo ^ lo si deve mettere da qualsiasi parte TRANNE che all'inizio, e
per il carattere - deve essere l'ultimo prima della parentesi.</LI>
<LI>* il carattere precedente pu&ograve; essere presente 0 o pi&ugrave; volte</LI>
<LI>+ il carattere precedente pu&ograve; essere presente 1 o pi&ugrave; volte</LI>
<LI>? il carattere precedente pu&ograve; essere presente 0 o 1 volte al massimo</LI>
<LI>{n} il carattere precedente pu&ograve; essere presente esattamente n
volte</LI>
<LI>{n,} il carattere precedente pu&ograve; essere presente almeno n volte</LI>
<LI>{n,m} il carattere precedente pu&ograve; essere presente almeno n volte
e al massimo m</LI>
<LI>due espressioni regolari possono essere concatenate, ottenendone un'altra
generata dalla concatenazione dei risultati delle sottostringhe</LI>
<LI>due espressioni regolari separate da | diventano alternative</LI>
<LI>la ripetizione ha precedenza pi&ugrave; alta rispetto alla concatenazione, che
a sua volta ha precedenza pi&ugrave; alta rispetto all'alternativit&agrave; (usate le parentesi
tonde per modificare questo comportamento)</LI>
<LI>per eseguire il confronto con una parola intera invece che con una sottostringa,
racchiudetela tra \&lt; e \&gt;: ad esempio \&lt;test\&gt;
riconoscer&agrave; "test" ma non "testing"</LI>
<LI>di solito i confronti non sono sensibili a maiuscole o minuscole, quindi
un piccolo errore sar&agrave; perdonato!</LI>
</UL>
<HR>
<A HREF="Quick-Easy-Configuration-HOWTO-9.html">Avanti</A>
<A HREF="Quick-Easy-Configuration-HOWTO-7.html">Indietro</A>
<A HREF="Quick-Easy-Configuration-HOWTO.html#toc8">Indice</A>
</BODY>
</HTML>