Co je procmail?

Procmail slouží na zpracování příchozí pošty. Na FI není nutné na jeho fungování volání pomocí souboru .forward, ale stačí existence konfiguračního souboru .procmailrc. Program procmail se spustí pro každou zprávu a dle pravidel, které najde v uvedeném konfiguračním souboru, vykoná akci příslušící danému pravidlu. Umí například zprávu uložit do zadaného mailboxu nebo poslat zprávu externímu programu.

.procmailrc

Soubor .procmailrc se musí nacházet v domovském adresáři. Skládá se z pravidel, která mají dvě části. První část popisuje zprávu, pro kterou se má dané pravidlo uplatnit, a druhá je samotná akce – tedy co dělat se zprávou, která pravidlu vyhovuje. Například:

:0:
* ^From.*adam
adambox

Toto pravidlo uloží každou zprávu přicházející z adresy, která obsahuje podřetězec adam, do mailboxu adambox. Všechny cesty jsou relativní k adresáři nastavenému v proměnné MAILBOX (na FI domovský adresář). Chcete-li číst poštu přes IMAP, který na FI hledá mailboxy v adresáři ~/mail/, přidejte na začátek souboru .procmailrc řádek

MAILDIR=$HOME/mail

Pravidlo vždy začíná řádkem, kde prvním znakem je ":" a za ním následuje seznam příznaků, které popisují zpracování zprávy, tedy například zda se má kromě hlaviček kontrolovat i tělo zprávy, zda se má zpráva po zpracování akcí přeposlat dalším pravidlům a podobně (detaily viz manuálová stránka procmailrc).

V uvedeném příkladě tedy první řádek začíná pravidlo. (Číslo 0 je historický pozůstatek a nemá žádnou funkci, ale je součástí začátku pravidla a je třeba je tam ponechat.) Následuje příznak ":", který zajistí zamknutí souboru adambox a předejde tak jeho poškození v případě, kdy by probíhalo více zápisů do něj současně. Tento příznak doporučujeme použít vždy, když pravidlo ukládá zprávy do mailboxu. Bez uvedení dalších příznaků očekáváme výchozí funkčnost (z toho je nejdůležitější to, že se kontrolují jenom hlavičky zprávy, a ne tělo). Druhý řádek je podmínka, která popisuje, pro které zprávy pravidlo platí. Každá podmínka se nachází na jednom řádku, začíná znakem "*" a všechno za ním je interpretováno jako regulární výraz (POSIX 1003.2 RE) kompatibilní s rozšířenými regulárními výrazy programu egrep (viz manuálová stránka egrep a regex). A konečně třetí řádek je akce. Akce je vždy jeden řádek na konci pravidla. V tomto případě to znamená, že zpráva se uloží do mailboxu adambox.

Modifikace předchozího jednoduchého příkladu je pravidlo pro procmail, které všechnu přicházející poštu uloží do mailboxu myspool:

:0:
myspool

Komplikovanější příklad:

:0 c
* ^From.*adam
* ^Subject:.*compilers
! william@example.com
    
:0:
* ^Subject:.*perl compilers
perlcomp

Tento příklad má dvě pravidla. Na řádku 1 se nachází příznak "c", který říká, že zpráva neskončí u tohoto pravidla, ale její kopie se pošle na další zpracování. Pravidlo tedy pro všechny zprávy od uživatele adam s předmětem, který obsahuje podřetězec "compilers", vykoná akci na řádku 4, což znamená přeposlání zprávy na adresu william@example.com. Druhé pravidlo uloží všechny zprávy týkající se překladačů Perlu do mailboxu perlcomp.

Přeposílání (forwarding) e-mailů pomocí Procmailu

Procmail nám umožňuje nastavit stejné přeposílání e-mailů jako soubor .forward, tedy se zachováním obálkové adresy odesílatele. Příklad nastavení viz níže. Pozor: v uvedených hranatých závorkách jsou vždycky dva bílé znaky: mezera a tabulátor. Řetězec Xuzivatel nahraďte svým loginem, např. Xnovak29.

:0
* !^X-FI-Xuzivatel-Loop
{
    :0fw
    | formail -a 'X-FI-Xuzivatel-Loop: loop prevention'

    :0
    * ^Return-Path:[    ]*\/[^  ].+
    { env=$MATCH }

    :0
    ! ${env+-f "$env"} honza.uzivatel@example.com
}

Ve fakultním prostředí je hlavní rozdíl oproti použití .forward v tom, že se před přeposláním uplatní všechna nastavení Procmailu, například spamový filtr nebo automatická odpověď na e-mail v nepřítomnosti.

Odstraňování obrázků log z mailů

Pokud čtete poštu v její textové verzi, můžou vás rušit podpisy nebo loga, které se zobrazují jako příloha u HTML zpráv, i když nejde o přílohu, které byste měli věnovat pozornost. Pokud jde o vždy opakující se obrázky, na jejich odstraňování můžete využít náš skript.

Podmínkou je, že poštu přijímáte na serveru Anxur (lze ověřit ve Fakultní administrativě).

Do svého .procmailrc přidejte tyto řádky:

:0fW
| /usr/local/libexec/image-attachment-filter.pl

Pak je třeba vytvořit soubor ~/.image-attachment-filter.cfg, kam umístíte SHA-256 hashe příloh, které chcete smazat (za hashem může být komentář), třeba takto:

$ cat ~/.image-attachment-filter.cfg
1373b8627155d238a9856e3342961f1946858932086f7a2565b483b1959e14d9 Logo firmy XY

Hash je výstup z programu sha256sum (lze použít pro spočítání hashů dalších příloh, které chcete odmazávat).

Upozorňujeme, že zrušením přílohy se poruší případné elektronické podpisy zprávy.

Pravidla pro kódované hlavičky

Hlavičky jsou v případě výskytu znaků mimo ASCII kódovány, co vám může znesnadňovat použití pravidel procmailu. Zatímco procmail vidí hlavičku

Subject: =?UTF-8?B?TcOhbWUgdsSbdMWhw60gcHJvYmzDqW0=?=

dekódovaná podoba, kterou vidíte v mailových klientech, mu dostupná není:

Subject: Máme větší problém

Toto lze řešit přidáním nové dekódované verze hlavičky (každou je nutné přidat samostatně) ještě před dalšími pravidly v .procmailrc, které ji budou využívat. Příklad pro hlavičku Subject, kterou si po dekódování uložíme do SUBJECT:

# extract the header if it's MIME-encoded
:0 h
* ^Subject:.*=\?
SUBJECT=| formail -cXSubject: | perl -MEncode=from_to -pe 'from_to $_, "MIME-Header", "utf-8"'

# if the header is not MIME, just extract it
:0 hE
SUBJECT=| formail -cXSubject

# make a decision based on the decoded header
:0:
* SUBJECT ?? ^Subject:.*větší
bigger

Zdroj inspirace.