Poštovní server
s virtuálními účty trochu jinak III
Filtry pro Dovecot
26.8.2011

Tento text je volným pokračováním článku Poštovní server s virtuálními účty trochu jinak a článku Poštovní server s virtuálními účty trochu jinak II. Testováno na distribuci GNU/Linuxu openSUSE 11.3. Programy Postfix (verze 2.7) a Dovecot (verze 1.2) používají uživatele vmail (UID=999) a grupu vmail (GID=999), viz kapitola "Zvýšení bezpečnosti" v předchozím dílu dole. Všechny práce provádí root.

Dovecot jako LDA pro Postfix

Nejprve naučíme Postfix doručovat do schránky pomocí programu Dovecot (Local Delivery Agent). Nejprve upravíme hlavní konfigurační soubor Postfixu:
/etc/postfix/main.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
A do konfiguračního souboru služeb Postfixu vložíme
/etc/postfix/master.cf
dovecot unix    -       n       n       -       -      pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
V konfiguračním souboru pro Dovecot upravíme následující oddíly:
/etc/dovecot/dovecot.conf
...
protocol lda {
    ...  
    postmaster_address = postmaster@domena1.xx    # nutno vyplnit!
    auth_socket_path = /var/run/dovecot/auth-master
}
...
auth default {
    ...
    userdb static {
        ...
        args = uid=999 gid=999 home=/var/spool/mail/%u 
        ...
    }
    ...
    socket listen {
        master {
            path = /var/run/dovecot/auth-master
            mode = 0660
            user = dovecot
            group = vmail
        }
        client {
            path = /var/spool/postfix/private/auth
            mode = 0660
            user = postfix
            group = vmail
        }
    }
}
...
Po změně konfiguračních souborech je nutné znovunačíst konfiguraci pro Postfix:
/etc/init.d/postfix reload
nebo v openSUSE:
rcpostfix reload
A pro Dovecot:
/etc/init.d/dovecot reload
nebo v openSUSE:
rcdovecot reload
Nyní by měl Postfix využívat služeb programu Dovecot pro doručování dopisů do jednotlivých poštovních schránek. Poznáme to lehce z výpisu logu činnosti Postfixu, při příjmu dopisu se objeví řádek:
Aug 22 16:32:54 wd250 postfix/pipe[29729]: 614121C1B6B: to=<josef@domena1.xx>, relay=dovecot, 
delay=0.21, delays=0.1/0/0/0.11, dsn=2.0.0, status=sent (delivered via dovecot service)
Pokud něco nefunguje vyplatí se pohlédnout do výše zmíněného logu, případně lze nastavit podrobnější log pro Dovecot:
/etc/dovecot/dovecot.conf
...
log_path = /tmp/dovecot.log
...
Aktuální nastavení programu Dovecot zjistíte příkazem /usr/sbin/dovecot -n a nastavení Postfixu příkazem /usr/sbin/postconf. Více o nastavení programu Dovecot najdeme na wiki Dovecot LDA

Dovecot filtry

V konfiguračním souboru pro Dovecot nastavíme možnost zpracování filtrů:
/etc/dovecot/dovecot.conf
protocol lda {
    ...
    mail_plugins = sieve
    mail_plugin_dir = /usr/lib64/dovecot/modules/lda
    ...
}
plugin {
    sieve = /var/lib/sieve/%u.sieve
}
Řádek sieve v sekci plugin, ukazuje, kde lze nalézt uživatelské filtry. Zástupné znaky %u znamenají název poštovního účtu, tedy pro poštovní adresu josef@domena1.xx se bude hledat filtr s názvem josef@domena1.xx.sieve. Adresář /var/lib/sieve musí umožňovat grupě vmail zápis (nutné pro automatickou kompilaci fitrů, viz níže)!
V sekci plugin mohou ovšem existovat i další nastavení. Toto je cesta k globálnímu filtru, který je proveden pouze pokud neexistuje uživatelský skript:
    sieve_global_path = /var/lib/sieve/default.sieve
Umístění globálních filtrů, které je možno vkládat do uživatelských filtrů pomocí direktivy include :global :
    sieve_global_dir = /var/lib/sieve/global/
A toto je umístění osobních uživatelských filtrů, vkládaných pomocí direktivy include :personal :
    sieve_dir = /var/lib/sieve/%u.lib
Jednotlivé uživatelské filtry jsou při aktivaci kompilovány a výsledek je automaticky uložen s koncovkou .svbin, tedy například josef@domena1.xx.svbin. Ostatní filtry je možné ručně kompilovat pomocí příkazu:
sievec název_filtru

Jednoduché příklady uživatelských filtrů

Neobsahuje-li příchozí pošta vybrané hlavičky, je bez upozornění zahozena:
if not exists ["From","Date"] {
    discard;
}

Pokud příchozí pošta obsahuje v předmětu slovo "pozor" (nezáleží na velikosti písmen), bude automaticky přesunuta do složky pozor. INBOX je název jmenného prostoru:
require "fileinto";

if header :contains "subject" ["pozor"] {
    fileinto "INBOX.pozor";
}

Filtr pro automatickou odpověď. V nastavení :address je nutné uvést i všechny případné aliasy. Příjemce automatické odpovědi pak obdrží tuto zprávy maximálně jednou za dva dny, bez ohledu kolik dopisů pro příjemce poslal (nastavení :days).
require "vacation";

vacation
    :addresses ["josef@domena1.xx", "pepa@domena1.xx"]
    :days 2
    :subject "Automaticka odpoved: momentalne jsem na dovolene"
"Dobry den,
bohuzel jsem prave na dovolene. Jakmile to bude mozne, ozvu se!
    Josef";

Filtr pro odmítnutí nadměrně velké zprávy. Odesílatel bude informován a další provádění filtru je ukončeno:
require "reject";

if size :over 2M {
    reject "Message over 2MiB size limit.";
    stop;
}
Pokud je nalezena syntaktická chyba v fitru, je založen chybový log (například josef@domena1.xx.sieve.log), kde lze nalézt popis chyby.
Mnohem bohatější ukázky možností filtrů najdete například na Dovecot Sieve plugin a FastMailWiki. Kompletní popis jazyka filtrů naleznete v RFC 5228.

Kontakt

http://jiri.jozif.googlepages.com
email: jiri.jozif (zavináč) gmail (tečka) com