Zpět na obsah

Maildrop - filtr pro zpracování pošty

Maildrop je filtr pro automatické zpracování nově došlé pošty. Umožňuje víc věcí než program filter (který je součástí programu elm a stejně jako on je hodně hodně starý) a přitom je jeho použití jednodušší než program procmail. V současné době je ve verzi 1.3.6 a je možné ho podle tohoto návodu používat na serverech dec59.ruk.cuni.cz a dec52.lf1.cuni.cz. Originální dokumentaci (v angličtině) najdete na jeho domácí stránce http://www.flounder.net/~mrsam/maildrop/

Pozor! V případě chyby v konfiguračním souboru můžete přijít o nově došlé dopisy. Po nastavení filtru si proto pro jistotu zkuste otestovat, zda vám pošta chodí.


Obsah:

Aktivace filtru
Konfigurace
Docela důležitý úvod
Základní příkazy
Podmínky
Logování
Kde používat uvozovky a kde ne
Malá a velká písmena

Aktivace filtru

Do souboru .qmail přidat spouštění filtru:

| preline /usr/local/bin/maildrop

Od této chvíle prochází všechny nově došlé dopisy filtrem. Pamatujte na to, že nový dopis může přijít v každém okamžiku a to i při ladění konfigurace filtru.

Poznámka: nezapomeňte v .qmail souboru na "preline", jinak bude adresa odesílatele v prvním řádku záhlaví (ve From ) nahrazena vaší vlastní adresou, což může někde vadit. Konkrétně při forwardování pošty na mobil Eurotelu.

Konfigurace

Důležitý úvod

Konfiguraci hledá maildrop v domácím adresáři v souboru .mailfilter.

Pokud soubor nenajde nebo pokud nejsou v souboru žádné příkazy (kromě komentáře), dopisy jsou uloženy obvyklým způsobem (do souboru Mailbox).

Najde-li maildrop v souboru syntaktickou chybu (před zpracováním pošty napřed zkontroluje celý konfigurační soubor), dopis nebude doručen a zůstane v systémové frontě. Systém se bude snažit dopis opakovaně doručit. Pokud se mu to nepodaří během určité doby (tj. syntaktická chyba v konfiguračním souboru zůstane neopravena), vrátí dopis odesílateli jako nedoručitelný. Nepříjemné je, že o tom, že nemůže dostávat poštu, se člověk nedoví (protože nemůže dostávat poštu a systém nemá jiný způsob, jak ho informovat).

Doporučení:

Poznámka: Syntaktická chyba nemusí být nutně to, co by člověk čekal. Příklad:

# priklad konfiguracniho souboru
# (radky zacinajici znakem '#' jsou komentare)
blabla blabla blabla

je syntakticky správně, ač je to evidentně blábol. Maildrop přitom nic neřekne a s klidem doručí každý dopis obvyklým způsobem.

# priklad konfiguracniho souboru s chybou
if (/From: jiri@post.cz/
    to Mail/jiri

je syntakticky špatně (chybí závorka za podmínkou v if) a maildrop nechá dopis v systémové frontě.

Základní příkazy

Prázné řádky jsou ignorovány. Řádky začínající znakem # jsou považovány za komentáře. Pokud je lepší pro přehlednost něco rozdělit na víc řádek, je nutné na konec řádky napsat znak \.

Základní příkazy jsou to a cc. Používají se pro zapsání instrukcí jak naložit s dopisem. Rozdíl mezi nimi je ten, že po maildrop po vykonání příkazu cc (carbon copy) pokračuje ve zpracování dalších instrukcí, kdežto po vykonání příkazu "to" skončí.

Jako parametr může být následující:

Pokud filtr při zpracování nenarazí na příkaz "to" nebo pokud konfigurační soubor obsahuje jen komentáře, je prázdný nebo dokonce neexistuje, zafunguje defaultní pravidlo - dopis bude standardně uložen do mailboxu. Není tedy nutné toto pravidlo

to $DEFAULT

psát. (Poznámka - v proměnné DEFAULT je jméno mailboxu. Bylo by možné uvést přímo jméno souboru, ale je lepší používat proměnnou, protože mailbox může být na různých systémech jinde).

Příklad:

# priklad konfiguracniho souboru .maildrop

# kopie dopisu posilat na adresu jiri@post.cz
cc "!jiri@post.cz"
# a vsechny dopisy ukladat do folderu Mail/vsechny
to Mail/vsechny

V tomto příkladu na konci je příkaz "to", takže filtr na něm skončí a dopis se v mailboxu neobjeví.

Podmíněné zpracování

To co opravdu umožňuje automatické zpracování pošty je možnost příchozí dopisy otestovat a podle výsledku s nimi nějak naložit. Podmíněné zpracování se zapisuje

if (podmínka)
   akce, která se má vykonat v případě splnění

Má-li se v případě splnění podmínky vykonat víc než jedna akce, je nutné je zapsat do složených závorek:

if (podminka)
{
  akce1
  akce2
  ...
}

Je možné použít i klasické if ... else:

if (podminka)
  akce v pripade splneni
else
  akce v opacnem pripade

Opět - chcete-li použít víc než jeden příkaz, musíte je dát do složených závorek.

A teď k podmínkám. Obvykle nás zajímá v dopise

Čili nejčastější podmínka je testování příslušné řádky v záhlaví dopisu. Adresa odesílatele je na řádce, která začíná "From:", subject je na řádce, která začíná "Subject:", adresa příjemce je na řádce, která začíná "To:". Způsob zápisu, který používá maildrop, vypadá na první pohled trochu složitě, ale dovoluje psát opravdu precizní a podrobné podmínky.

Příklad:

# priklad konfiguracniho souboru .mailfilter

# pro jistotu kopie kazdeho dopisu ukladat do folderu zaloha
cc Mail/zaloha
# dopisy od Jirky ukladat do folderu jirka
if (/^From:.*jirka@post.cz.*/)
   to Mail/jirka

Přeloženo do lidského jazyka to znamená: Jestliže řádka záhlaví dopisu, která začíná "From:", obsahuje "jirka@post.cz", ulož dopis do folderu Mail/jirka a skonči.

Ještě jednou podrobněji, s vysvětlením speciálních znaků: Některá řádka záhlaví dopisu ( "/.../" je test řádek záhlaví dopisu) musí začínat "From:" (znak "^" znamená, že znak za ním musí být na začátku řádky) , pak může být cokoliv (znaky ".*" znamenají cokoliv, tedy nic nebo libovolnou kombinaci libovolného počtu znaků - podrobněji to bude vysvětlené později) , pak musí být "jirka@post.cz" a pak může být zase cokoliv.

Jestliže tato podmínka platí, provede se příkaz na dalším řádku, pokud ne, následující řádek se přeskočí a pokračuje se dál (v tomto případě defaultní akcí ).

Má-li se při splnění podmínky provést víc než jeden příkaz, musí se napsat mezi složené závorky. Příklad:

# priklad konfiguracniho souboru .mailfilter
# dopisy od Jirky ulozit do folderu jirka a kopii poslat Jane
if (/^From:.*jirka@post.cz.*/)
{
   cc "!jana@lf4.cuni.cz"
   to Mail/jirka
}

K čemu je dobré testovat adresu, na kterou dopis přišel? V adrese příjemce totiž nemusí být vždycky vaše vlastní adresa. Typicky dopisy z elektronické konference mají jako adresu příjemce uvedenou adresu konference. Dále je možné, že máte ke své adrese několi aliasů - třeba adresu správce www stránky, adresu svého pracoviště apod. Příklad:

# priklad konfiguracniho souboru .mailfilter
# dopisy co maji v subjectu "na mobil" forwardovat na muj telefon
if (/^Subject:.*na mobil.*/)
   cc "!janj@sms.paegas.cz"
# dopisy na webmastera ukladat do folderu webmaster
if (/^To:.*webmaster@lf4.cuni.cz.*/)
   to Mail/webmaster
# kopii dopisu na adresu pracoviste posilat svemu zastupci
if (/^To:.*biologie@lf4.cuni.cz.*/)
   cc "!ma_prava_ruka@lf4.cuni.cz"
# a ostatni nechavat v mailboxu - to je ale default a nemusim to psat

Další, co nás může na dopise zajímat, je jeho délka. Velikost dopisu je k dispozici ve dvou proměnných a proměnné můžeme snadno testovat:

Počet řádek je včetně záhlaví a včetně případných příloh (které jsou zakódované do podoby textu), takže bohužel nejde takto jednoduše udělat podmínka "posílej mi na mobil jen zprávy, co mají maximálně dvě řádky textu".

Často také potřebujeme napsat složitější podmínku. K tomu slouží operátory "&&" (logické AND) a "||" (logické OR). Příklad:

# priklad konfiguracniho souboru .mailfilter
# Jirka mi obcas posila kreslene vtipy, ktere se mi
# vubec nelibi a ani je nechci cist
if ( /^From:.*jirka@post.cz.*/ && ($SIZE > 100000) )
   to /dev/null

Poznámka: maildrop nemá zvláštní příkaz pro mazání dopisu, proto je v příkladu použito uložení dopisu do souboru /dev/null, což je ve světě unixu běžný způsob, jak něco zahodit

Ve všech zatím uváděných příkladech jsme testovali jen řádky záhlaví dopisu. Pokusíme-li se testovat i řádky v textu dopisu, nebude filtr fungovat. Proč? Protože program Maildrop pro urychlení testuje defaultně jen řádky záhlaví. Chceme-li testovat text (tělo) dopisu, musíme k výrazu připsat ":b":

# priklad konfiguracniho souboru .mailfilter
# nechci dostavat reklamu na feromony, neboli maily, 
# ktere maji v tele slovo "pheromone" a zaroven "sex"
if ( /pheromone/:b && /sex/:b )
   to /dev/null

Logování

Chcete-li mít záznamy o činnosti filtru, můžete mu nařídit, aby všechny činnosti zaznamenával. Hodí se to i v případě, že si chcete ověřit, zda vaše konfigurace opravu funguje. Příkazem logfile můžete zadat jméno konfiguračního souboru a maildrop do něj začne zapisovat své akce. Příkazem log můžete do souboru připsat cokoliv sami dle svého uvážení. Příklad:

# priklad konfiguracniho souboru .mailfilter
# chci logy v souboru maillog
logfile ./maillog
# zatraceni spameri
if (/^Subject:.*easy money.*/)
{
    log "smazan spam delky $LINES radek"
    to "/dev/null"
}

Kde používat uvozovky a kde ne

V dosud uvedených příkladech jsou někde parametry příkazů v uvozovkách a někde ne. Jak to tedy je? Uvozovky není nutné použít, pokud parametr je pouze z písmen, číslic a znaků "_-.:/$()@". Takže jména souborů (folderů) nemusí být v většinou v uvozovkách, protože jiné znaky obsahují vyjímečně (mezery a diakritiku). Oproti tomu adresu na kterou se má dopis forwardovat či jméno spouštěného programu musíme dát do uvozovek, protože adrese musí předcházet znak "!" a programu znak "|".

Malá a velká písmena

Při testování řádek záhlaví není nutné brát zřetel na velikost písmen, protože před porovnáním se všechny texty převedou na malá písmena. Jen pokud chceme, můžeme při testování k velikosti písmen přihlížet. V tom případě musíme uvést k výrazu parametr ":D", např.

# zareaguj jen na kombinaci malych a velkych pisme
if ( /MaLaVeLkA/:D )
     to "./Mail/test"

Pokračování

Má-li někdo zájem na pokračování návodu, ať se mi ozve... 


Vladimír Horák vhor@cuni.cz 15. října 2008