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.) Neuvedení žádných příznaků znamená, že 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.*peter
* ^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.