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 = 1A 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 reloadnebo v openSUSE:
rcpostfix reloadA pro Dovecot:
/etc/init.d/dovecot reloadnebo v openSUSE:
rcdovecot reloadNyní 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.