Newsgroup: it.comp.os.linux.sys
Titolo: Per chi si vuol divertire con procmail

Ho un server che gestisce una piccola mailing list. La cosa è molto
semplice, procmail filtra le mail mandate all'indirizzo, filtra via il
pattume e fa un po' di controlli, ciò che sopravvive lo passa a uno
script in pipe che con un po' di bash e un po' di awk spedisce a tutti i
destinatari.
Orbene... la lista richiedeva una sottoscrizione per RICEVERE i
messaggi, ma ci siamo accorti che qualche spammer rompicoglioni ci
mandava i messaggi!!!
Allora sono corso ai ripari, e ho pensato di inserire un filtro che
permettesse anche il posting solo a chi è iscritto (oltre al subscribe,
ovviamente).
E qui viene il problema.
Procmail, in teoria, sembra permettere una cosa utile. In pratica, opero
così:
:0 c
| formail -x From: > /tmp/mittente ; \
RESPINTO="" ; \
rm -f /tmp/respinto ; \
MITTENTE=`cat /tmp/mittente | cut -d \< -f 2 | cut -d \> -f 1` ; \
if ! (cat iscritti | grep $MITTENTE) then (RESPINTO="reject") ; \
rm -f /tmp/mittente 
:0 Wi
* ? (test $RESPINTO) 
/dev/null
Il primo blocco non fa altro che recuperare l'indirizzo del mittente e
confrontarlo con quelli presenti nell'elenco degli iscritti. Questo
funziona perché uso script analoghi da altre parti e vanno. Se il
mittente non è fra gli iscritti, la variabile "RESPINTO" assume il
valore "reject", altrimenti resta vuota.
Poi casca l'asino. La forma :0 Wi ... * ? etc è da manuale di
procmailex, ma NON FUNZIONA.
Per motivi insondabili il test su $RESPINTO viene fatto, ma non viene
onorato... Da manuale di test, test $VAR testa la lunghezza della
stringa indicata, con un exitcode positivo se è diversa da zero.
La grande domanda è... PERCHE' NON VA???????????????????????
Quello che so è che:
1) l'estrazione dell'indirizzo mittente e l'assegnazione della variabile
RESPINTO viene fatta;
2) test $RESPINTO, al di fuori di procmail, funziona correttamente.
E allora???? Qualche anima pia ha qualche idea??? Grazie!
-- 
Massimo Bacilieri AKA Crononauta 
mailto:
ulib...@libero.it
 ; ICQ:4005815

 /dev/null
Ho risolto da solo. Tra l'altro adesso ho messo a punto un metodo che
può tornare utile a qualcuno, magari. Ovvero come filtrare in procmail
sulla base di parole, indirizzi, nick o altro presenti in una lista
esterna, in un normale file di testo.
Utilissimo in particolare per quelli come me che non sopportano chi
scrive usando "ke", "xò" e via dicendo (vengono automaticamente cassate,
tali lettere... se uno mi vuole scrivere, che impari a farlo senza
urtarmi i nervi!!!) ;-)
Ecco la soluzione.
:0 Wc
| formail -x From: > /tmp/mittente ; \
rm -f /tmp/killedflag ; \
MITTENTE=`cat /tmp/mittente | cut -d \< -f 2 | cut -d \> -f 1` ; \
if (echo $MITTENTE | grep -f killfilter.txt) then (touch /tmp/killedflag) fi ; \
rm -f /tmp/mittente 
:0
* ? test -e /tmp/killedflag
/dev/null
In killfilter.txt mettete tutti i vostri "nemici" *anche parziali, il
filtro funziona che se in lista mettete "devnul", vengono filtrati tutti
gli indirizzi che in qualche maniera contengono "devnul":
devn...@prova.it
testd...@test.it
pr...@domaindevnulling.xy
e via dicendo.
Se a qualcuno può essere utile...


 if (echo $MITTENTE | grep -f killfilter.txt) then (touch /tmp/killedflag) fi ; \
Pardon, manca un flag: è "grep -F -f killfilter.txt ..." etc.,
altrimenti killa tutto e perdete tutta la posta!


 if (echo $MITTENTE | grep -f killfilter.txt) then (touch /tmp/killedflag) fi ; \
Mi permetto di suggerire:
if (echo "^$MITTENTE$" | grep ...
Altrimenti, se hai un 
pi...@provider.it
 in killfilter.txt, fai fuori
anche 
alp...@provider.it
, 
giuse...@provider.it
,
giop...@provider.it...  
Massimiliano