Portál AbcLinuxu, 25. října 2025 12:30


INBOX INBOX.Drafts INBOX.Sent INBOX.Trash INBOX.SPAM INBOX.SPAM.isSPAM INBOX.SPAM.noSPAMDo složky SPAM je doručena každá zpráva, která je DSPAMem vyhodnocena jako SPAM. V případě chybného vyhodnocení zprávy jako SPAM (false positive) postačí, aby uživatel tuto zprávu přesunul do podsložky noSPAM. V případě chybného vyhodnocení zprávy jako neSPAM (false negative) postačí, aby uživatel tuto zprávu přesunul do podsložky isSPAM. Tento postup mj. odstraňuje všechna výše zmíněná úskalí - uživatelé nepřeposílají, ale většinou zprávy jednoduše drag&drop přesunou přímo ve svém oblíbeném e-mailovém klientovi do příslušné složky, bez problémů takto mohou přesunovat více zpráv najednou a při přesouvání mezi složkami nedochází ke změně obsahu, tzn. nemůže dojít ke ztrátě identifikační značky DSPAMu. Sám o sobě by tento mechanismus nefungoval, na straně serveru je proto potřeba zajistit proces, který bude procházet tyto podsložky a předávat obsažené zprávy DSPAMu ke znovuzpracování. Uvedu zde jednoduchý příklad, který úspešně používám na serverech s malým počtem uživatelů, kteří na serveru mají bežný účet (tzn. nejedná se o virtuální uživatele). Celé řešení je nezávislé na použitém softwaru pro realizaci potřebných služeb (SMTP, IMAP ..). Ve většině instalací používám k plné spokojenosti Postfix v kombinaci s Maildropem a Courier-IMAPem.
Postfix -> Maildrop[ClamAV,DSPAM] -> Maildir <-> Courier-IMAPGlobální konfigurační soubor pro MDA Maildrop, který zajistí antivirovou kontrolu přes ClamAV a přesunutí zprávy vyhodnocené jako SPAM do příslušné složky vypadá takto:
DEFAULT="$HOME/Maildir"
SPAMFOLDER="$DEFAULT/.SPAM/"
if(`/usr/bin/clamdscan --no-summary --stdout - | grep -c 'FOUND'` == 1)
{
to "/dev/null"
}
xfilter "/usr/bin/dspamc --user $USER --stdout --deliver=innocent,spam"
if(/^X-DSPAM-Result: Spam.*$/)
{
to $SPAMFOLDER
}
to $DEFAULT
Skript, který prochází příslušné podsložky schránky a předává nalezené zprávy ke znovuzpracování DSPAMu, může v tomto případě vypadat takto:
#!/bin/bash
MAILDIR=$HOME/Maildir
SPAMFOLDER=$MAILDIR/.SPAM
ISSPAMFOLDER=$SPAMFOLDER.isSPAM
NOSPAMFOLDER=$SPAMFOLDER.noSPAM
DSPAM_FP="dspamc --user $USER --class=innocent --source=error --stdout --deliver=spam,innocent"
DSPAM_FN="dspamc --user $USER --class=spam --source=error --stdout --deliver=spam,innocent"
for folder in {$NOSPAMFOLDER/cur,$NOSPAMFOLDER/new,$ISSPAMFOLDER/cur,$ISSPAMFOLDER/new}; do
for message in `ls -A $folder`; do
mv "$folder/$message" "$folder/../tmp/"
done
done
for falsepositive in `ls -A $NOSPAMFOLDER/tmp`; do
cat "$NOSPAMFOLDER/tmp/$falsepositive" | $DSPAM_FP > "$MAILDIR/new/$falsepositive"
rm "$NOSPAMFOLDER/tmp/$falsepositive"
done
for falsenegative in `ls -A $ISSPAMFOLDER/tmp`; do
cat "$ISSPAMFOLDER/tmp/$falsenegative" | $DSPAM_FN > "$SPAMFOLDER/new/$falsenegative"
rm "$ISSPAMFOLDER/tmp/$falsenegative"
done
Tento skript je v pravidelných intervalech (např. 5 minut) automaticky spouštěn z uživatelské cron tabulky. Hodí se pro menší instalace s lokálními účty.
Tiskni
Sdílej:
to $DEFAULTvlozim filtraci pres SpamAssasin a v pripade vyhodnoceni jako SPAM se zprava presune do slozky SPAM.isSPAM, kde je nasledne automaticky predana DSPAMu ke znovuvyhodnoceni:
xfilter "/usr/bin/spamc"
if (/^X-Spam-Level: \*\*\*\*\*.*$/)
{
to "$SPAMFOLDER/.isSPAM/"
}
Ta poslední varianta není asi moc férová vůči centrum.cz, nicméně můžu potvrdit, že je velice účinná 

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.