Procmail vs. maildrop

31. 1. 2000
Doba čtení: 5 minut

Sdílet

V dnešním článku nechci podrobně rozebírat, proč používat či nepoužívat jeden či druhý program uvedený v nadpisu, ale spíše vám sdělit, proč se domnívám, že maildrop je vhodnější volbou a dále se pak již věnovat přechodu z procmailu na maildrop.

Nejdříve bych rád řekl pár slov o tom, k čemu vlastně programy, jako procmail a maildrop slouží. Pokud se tedy v této oblasti cítíte dostatečně kovaní, následující odstavec klidně přeskočte.

Oba programy jsou takzvaní MDA – Mail Delivery Agents – a jejich úkolem je doručování emailů. V praxi to vypadá tak, že email obdrží MTA (Mail Transfer Agent – například sendmail) a ten se podle několika údajů (nastavení DNS, konfigurace SMTP a domény adresáta) rozhoduje, zda jde o email k lokálnímu doručení či k předání dál. Pakliže jde o email pro lokální doručení, přichází ke slovu MDA. Ten může být v podstatě velice primitivní a pouze umístit email do předem určeného mailboxu podle adresáta a nebo naopak může být mocným nástrojem pro filtrování příchozích zpráv. A právě do této druhé skupiny patří procmailmaildrop.

Jak jsem již předeslal, používám maildrop a teď je čas říct si proč. Osobně jsem měl hlavně tři důvody (řazeno podle důležitosti):

  • procmail při doručování načítá kompletně celou zprávu do operační paměti
  • definice pravidel pro maildrop je podle mého názoru přehlednější a snad i flexibilnější
  • procmail nedokáže bez dodatečných patchů doručovat poštu do schránek ve formátu Maildir (tato skutečnost je v mém pomyslném žebříčku na nejméně důležitém postu proto, že jsme se zatím k přechodu na Maildir nedostali; jakmile k tomu dojde, nabude samozřejmě na důležitosti)

Načítání celého emailu do paměti je vlastnost, za kterou by měli být autoři procmailu odsouzeni k veřejně prospěšným pracím :). Těžko říci, co je k tomu vedlo (snad rychlost?), ale v praxi to znamená, že pár větších emailů může server pěkně potrápit a třeba i shodit. Samotnému se mi to kdysi stalo, když jsem jako administrátor-zelenáč neomezil maximální velikost příchozího emailu a 100-megabajtová zpráva poslala server do věčných lovišť. Vzhledem k tomu, že objemy přenášených zpráv stále rostou a v emailech stále častěji najdete obrázky či dokonce videosekvence (jednou jsem dostal 19 MB velkou pozvánku na tiskovku – byl to M$ Word DOC se třemi řádky textu a zbytek tvořila mapa :), jsou obavy z chování procmailu opodstatněné, zvláště když si uvědomíme, že běžné servery na platformě Intel často umožňují osadit pouze 256 či 384 MB paměti.

A nyní se již podívejme na rozdíly v definicích filtrovacích pravidel obou programu. Na první pohled je jasné, že maildrop vychází z běžné koncepce programovacích jazyků, zatímco procmail razí vlastní cestu, syntaxe jeho konfiguračních souborů mi nepřipomíná naprosto nic. Pravda, to by ještě nemuselo nic znamenat, ale to by museli autoři procmailu ten svůj „jazyk“ navrhnout tak, aby byl srozumitelný a intuitivní, a to myslím není. Posuďte sami, následující příklad zajistí ukládání zpráv z adresy pepa@nekde.cz do složky od_pepy:

Tabulka č. 24
procmail maildrop

:0:
* ^From:.*pepa@nekde.cz
od_pepy

if (/^From:.*pepa@nekde.cz/)
        to od_pepy

Na tomto příkladu je zřejmé, že základním (i když ne jediným) prvkem pro definici filtrů jsou regulární výrazy. Jak jsem již konstatoval, každému, kdo se někdy setkal s libovolným programovacím jazykem, musí být jasné, co pravidlo maildropu provádí. Neřekl bych, že to samé lze říci o stejném pravidlu procmailu. Na první pohled by asi zkušenější uživatelé pochopili význam druhého řádku, ale proč je tam ta nula obklíčená dvojtečkami, to už tak jasné není. I smysl osamoceného slova od_pepy není příliš jasný.
A bude hůř, jak říká klasik :). Teď si uvedený příklad rozšíříme. Nejenom že chceme mít všechny maily od Pepy ve zvláštní složce, ale také by se hodilo, kdyby se automaticky poslaly Frantovi:

Tabulka č. 25
procmail maildrop

:0 c
* ^From.*pepa@nekde.cz
! franta@nekde.cz
        :0 A
        od_pepy

if (/^From:*pepa@nekde.cz/)
{
        cc "!franta@nekde.cz"
        to od_pepy
}

V případě maildropu byl zásah do konfigurace celkem minimální, šlo pouze o přidání řádku. Jediným potenciálně matoucím prvkem je, proč jsem použil „cc“ a nikoliv „to“, jako v prvním případě. Důvodem je fakt, že maildrop považuje výraz „to“ za definitivně poslední a po jeho provedení se ukončuje. Tím pádem jej není možné použít opakovaně, což o „cc“ neplatí.
Rozšíření pravidla pro procmail znamenalo změnu prvního řádku (je třeba programu říct, že budeme dělat kopii), přidat akci pro odeslání kopie (všimněme si, že maildrop a procmail mají i společné prvky, například znak ! uvozuje emailovou adresu) a nakonec přidat uvození dalšího pravidla, tentokrát s příznakem A („:0 A“), který značí, že pravidlo náleží k tomu předchozímu a tím pádem přebírá i jeho podmínku.

To by myslím jako demonstrace stačilo a domnívám se, že pokud nejste zrovna procmailový fanatik, musíte uznat, že jazyk maildropu je přehlednější a hlavně snáze pochopitelný. Moje zkušenost je navíc taková, že když si někdo nadefinuje komplexnější procmailová pravidla, tak se v nich jenom těžko orientuje kdokoliv jiný. Ačkoliv to není vyloučené ani s maildropem, řekl bych, že šance pochopit cizí úmysl je zde výrazně vyšší.

Z hlediska možností a funkcí jsou na tom oba programy v podstatě velice podobně. Následuje krátký přehled těch nejpoužívanějších s jednoduchou ukázkou pro oba programy.

ict ve školství 24

Tabulka č. 26
funkce procmail maildrop
Doručení zprávy
externím programem
| /cesta/k/programu to „|/cesta/k/pro­gramu“

nebo

cc „|/cesta/k/pro­gramu“

Filtrování zprávy
externím programem

dtto, ale začátek pravidla

musí obsahovat příznak f:

:0 f

xfilter „/ces­ta/k/programu“
Filtrování zpráv
podle rozměru

:0

* > 10000000

zpravy_nad_10MB

if ($SIZE > 1000000­0)
  to zpravy_nad_10MB

nebo

if ($LINES > 500)
  to zpravy_nad500_rad­ku

Přeformátování zpráv (např. přidání hlavičky) externí program formail:

:0 f | formail -A"Message-ID:"

externí program reformail:

xfilter „refor­mail \ -A'X-Envelope-From: $FROM'“

maildrop obsahuje také program reformime, který umožňuje pracovat s MIME zprávami

Myslím, že na uvedených příkladech je vidět, že maildrop, aniž by mu to ubralo na funkčnosti, nabízí přehlednější způsob definice filtrovacích pravidel. Aby bylo jasno, nevolám po jednoduchých řešení za každou cenu, ale volám po tom, aby program měl již v prvotním návrhu promyšleny klíčové prvky tak, aby zbytečně nekomplikoval život uživatelům. A třeba si mě ukamenujte, ale já si nemyslím, že by se tím autoři procmailu (ale i některých jiných programů) řídili. Možná, že tím sledovali něco, co dnes už ztratilo na významu (nebo se to přede mnou dovedně skrývá :). Ať tak či onak, řekl bych, že maildrop pěkně ukazuje, že to jde i jinak, aniž by bylo třeba děla kompromisy. A když k tomu navíc i odstraňuje zmiňovaný problém s načítáním emailu do paměti, nevidím mnoho důvodů, proč u procmailu zůstávat. Snad jedině velké množství již hotových pravidel a nechuť je předělávat pro maildrop, ale na druhou stranu, stojí vám zato to riskovat?

Autor článku