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í.
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.
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ě.
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í.
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
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" }
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 "|".
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"
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