My si dnes rozšíříme náš Sendmail s antispamem, antivirem o IMAP/POP3 server Dovecot a www rozhraní Roundcube. Přidáme si nějaké pluginy a patche. Výsledek bude ten, že uživatelé mají přístup k poště přes běžné protokoly, www rozhraní, možnost nastavit si automatické odpovědi, přesměrování a mnoho dalšího. Použití Sendmailu není tentokrát podmínkou, snadno jej lze nahradit jiným serverem.
Základ tvoří Sendmail, který už jsme si v minulých dílech připravili. Ten nám poštu zpracuje a pomocí procmailu uloží do uživatelských maildirů. Přístup k poště bude protokoly IMAP4 a POP3 a jejich zabezpečené verze IMAPS a POP3S. Šifrované verze protokolů nevyužívají jiných portů, ale nabízí na běžném portu možnost si TLS/SSL vyžádat (třeba příkaz STLS u POP3). Jako POP3 a IMAP4 server použijeme Dovecot. Ještě si do něho přidáme poměrně nový plugin pro Outlook express, který řeší mazání zpráv na IMAPu. Většina uživatelů očekává běžné chování, že smazané zprávy skončí v koši. U IMAPu toto ale funguje jinak. IMAP pouze označí zprávy ke smazání a později je pomocí příkazu EXPUNGE odstraní. Veškeré přesuny zpráv do koše si řeší klient, jen ten Outlook express to neumí.
Co je Roundcube?
Roundcube je jeden z mnoha webmailů a je napsaný v PHP. Podporuje různé druhy databází (MySQL, PostgreSQL, SQLite nebo MSSQL), lokalizován je i do češtiny a na rozdíl od mnohé konkurence i dobře vypadá. K dispozici je seznam jeho vlastností a několik oficiálních screenshotů.
Teď k praktickému řešení. Předpokládám, že Sendmail máte dle minulých dílu zkonfigurovaný, naše doména je firma.cz. Opět vše proběhne na FreeBSD, sw budeme kompilovat z jeho systému portů. Předpokládáme nainstalovaný www server Apache, PHP5 a MySQL.
Začneme instalací Dovecotu:
$ cd /usr/ports/mail/dovecot $ make install clean menu můžeme nechat tak, jak je (tedy zvoleno SSL a POP3)
Zajistíme spouštění Dovecotu při startu systému, přidáním příslušného řádku do /etc/rc.conf
:
echo 'dovecot_enable="YES"' >> /etc/rc.conf
Zabezpečení přenosu dat
Pro poštovní klienty, kteří využívají POP3/IMAP bude dobré protokol zabezpečit pomocí TLS/SSL. Ve výchozím stavu nejsou totiž tyto protokoly šifrované. Pokud ale chcete uživatelům umožnit přístup k poště jen přes www, nemusíte se certifikáty zabývat a můžeme je v konfiguraci vynechat. Dovecot v tom případě komunikuje s Roundcube pouze v rámci localhostu a není nutné to více řešit.
Připravíme si certifikáty pro TLS:
$ mkdir -p /etc/ssl/dovecot $ cd /etc/ssl/dovecot $ openssl req -new -x509 -nodes -out cert.pem -keyout key.pem -days 365
Konfiguraci najdeme v souboru /usr/local/etc/dovecot.conf
. Vypíšu položky, které budu měnit:
protocols = imaps pop3s imap pop3 ssl_disable = no ssl = yes ssl_cert_file = /etc/ssl/dovecot/cert.pem ssl_key_file = /etc/ssl/dovecot/key.pem mail_location = maildir:~/Maildir postmaster_address = postmaster@firma.cz
Potom můžeme Dovecot spustit:
$ /usr/local/etc/rc.d/dovecot start
Úložiště mailů
Malá odbočka k úložišti e-mailů. Poštu můžeme ukládat buď do mailboxu, tak jak to ve výchozím stavu dělá Sendmail nebo ve formátu maildir. Dovecot má přednastaveno mailbox ( mail_location = mbox:~/mail:INBOX=/var/mail/%u
). Inbox schránek je pak v adresáři /var/mail
, ostatní složky pak v domovských adresářích ve složce mail
. My ale použijeme maildir, jak je to uvedeno výše v konfiguračním souboru.
Přijmeme doručovatele na plný úvazek
Nyní je nutné upravit konfiguraci Sendmailu, konkrétně je třeba změnit lokálního doručovatele, který ukládá poštu do mailboxů. Tím může být třeba procmail
. Jeho instalace a konfigurace je snadná:
$ cd /usr/ports/mail/procmail $ make install
Vytvoříme jednoduchý konfigurační soubor /usr/local/etc/procmailrc
:
DEFAULT=$HOME/Maildir/
V souboru /etc/mail/mail.firma.cz.mc
změníme lokálního doručovatele. Přidáme řádek
FEATURE(local_procmail)
a změníme MAILER(local)
na MAILER(procmail)
.
Restartujeme Sendmail s upravenou konfigurací:
$ cd /etc/mail $ make $ make install $ make restart
Tím máme vyřešen příjem a uložení e-mailů.
Instalujeme Roundcube
Teď se můžeme pustit do instalace Roundcube:
Roundcube podporuje i jiné druhy databází, každý si určitě vybere. Používáme MySQL, je nutné založit uživatele pro Roundcube a naimportovat SQL dump, který je součástí instalace. Založíme si databázi a uživatele:
root@mail ~ # mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 98858
Server version: 5.1.35 FreeBSD port: mysql-server-5.1.35
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database roundcubemail; Query OK, 1 row affected (0.00 sec) mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> grant all privileges on roundcubemail.* to roundcube identified by 'round12345'; Query OK, 0 rows affected (0.04 sec) mysql> flush privileges; Query OK, 0 rows affected (0.02 sec)
Teď už jen naimportovat sqldump a máme databázi připravenou:
mysql -u roundcube -p roundcubemail < /usr/local/www/roundcube/SQL/mysql.initial.sql
Roundcube se nainstaluje do adresáře /usr/local/www/roundcube
. Uživatelům ho zpřístupníme na adrese www.firma.cz/posta
pomocí zápisu alias
v konfiguraci apache (soubor httpd.conf, zde je více možností, kde a jak www rozhraní zpřístupnit, třeba pomocí virtual host). Výše zmiňovaný alias se zapisuje takto:
Alias /posta /usr/local/www/roundcube/
Nyní nám Roundcube běží nešifrovaně na http. Samozřejmě bude lépe překonfigurovat Apache a provozovat vše na https. Ale to už je nad rámec dnešního článku.
Konfigurujeme Roundcube
Teď si roundcube nakonfigurujeme. V jeho adresáři config budeme pracovat se dvěma soubory. Nejprve připojení na mysql, to je v souboru /usr/local/www/roundcube/config/db.inc.php
. Vypisuji řádky, které měníme:
$rcmail_config['db_dsnw'] = 'mysql://roundcube:round12345@localhost/roundcubemail';
Druhý konfigurační soubor je /usr/local/www/roundcube/config/main.inc.php
:
$rcmail_config['default_host'] = 'localhost'; $rcmail_config['mail_domain'] = 'firma.cz'; $rcmail_config['create_default_folders'] = TRUE; // dovolíme uživatelům jednoduchý editor na tvorbu html emailů? $rcmail_config['htmleditor'] = TRUE; $rcmail_config['preview_pane'] = TRUE; $rcmail_config['check_all_folders'] = TRUE;
Samozřejmě si můžete vyhrát, konfigurace je docela obsáhlá. Většinu zde uvedených věcí si pak mohou uživatelé přenastavit přímo v Roundcube. Tím máme i Roundcube připravený a vše začíná fungovat dle představ. Můžeme vyzkoušet přihlášení. V případě problémů doporučuji kontrolovat /var/log/maillog
a error log Apache.
Patche a pluginy
Teď ještě slíbené patche a pluginy. U Dovecotu si nainstalujeme plugin, který upraví chování Outlook Expressu (případně jiných e-mailových klientů) při mazání zprávy. Očekáváme, že smazaná zpráva skončí v koši, ale o tento přesun se na imapu stará klient. Outlook Express toto nepodporuje, proto vznikl následující patch.
I přes ranou verzi se mi osvědčil. Na stránce pluginu je i postup, ale na FreeBSD mi kompilace a instalace nefungovala. Ale pokud vše uděláte „ručně“ (kompilace + nakopírování pluginu do patřičného adresáře), plugin bez problému funguje. Pak už jen v dovecot.conf přidat plugin:
mail_plugins = deleted_to_trash
restart dovecotu
$ /usr/local/etc/rc.d/dovecot restart
Odteď se i Outlook Express začne chovat jako ostatní klienti. Akce je i logována:
Oct 20 06:07:26 mail dovecot: IMAP(cilek): opening Trash succeeded Oct 20 06:07:26 mail dovecot: IMAP(cilek): from INBOX to Trash, previous action from (null) Oct 20 06:07:26 mail dovecot: IMAP(cilek): copying to Trash succeeded
Druhý plugin je pro Roundcube. Jmenuje se vacation
(jmenuje se stejně jako Sendmailový nástroj). Umožní nám přes www rozhraní nastavovat automatické odpovědi a přesměrování pošty. Je tu trošku problém, protože uživatelé nejsou virtuální, ale v systému (Sendmail umí virtuální uživatele přes LDAP) a tyto činnosti se nastavují pomocí .forward
a .vacation.*
souborů v domovských adresářích uživatelů (to už jsme v seriálu ukazovali). Takže roundcube potřebuje mít přístup do domovských adresářů (a to zajistit není vždy snadné). Plugin je ale dobře připravený a má více cest (nazývá je driver), jak toho dosáhnout. První možnost pro virtuální uživatele (pro nás nepoužitelné) je nastavovat tyto údaje stejně jako PostfixAdmin v databázi. Takže teoreticky lze Roundcube s tímto pluginem použít namísto PostfixAdmina
.
My ale potřebujeme přístup do domovských adresářů. Jsou dvě možnosti:
setuid backend
– využívá jakousi squirrelmail_vacation_proxy, pod FreeBSD v současném stavu asi těžko zkompilovatelnéFTP backend
– jednoduchá myšlenka. Na serveru spustíme malý ftp server, který bude mít potřebné přístupy.
Konfigurace FTP je jednoduchá, nemusíme nastavovat žádná práva, ftp backend se k ftp přihlásí jako daný uživatel Roundcube a soubory uloží. FTP server omezíme tak, aby poslouchal pouze na adrese localhost a tím jej poměrně slušně zabezpečíme. Nastavit takhle ftp na FreeBSD je snadné (teoreticky je možné spouštět ftpd
přes inetd
, ale pak nelze snadno omezit na IP):
$ echo 'ftpd_enable="YES"' >> /etc/rc.conf $ echo 'ftpd_flags="-a localhost"' >> /etc/rc.conf $ /etc/rc.d/ftpd start
Dále je nutné zkompilovat PHP s podporou ftp:
$ cd /usr/ports/lang/php5-extension $ make config (zaškrtněte FTP) make deinstall clean install
A restart Apache provedeme třeba takto
$ apachectl restart
Teď už jen samotný plugin, ten stáhneme z domovské stránky. Obsah archivu nakopírujte do adresáře plugins a v jeho konfiguračním souboru config.inc.php
nastavte driver na ftp pomocí
$rcmail_config['driver'] = 'ftp';
Nakonec povolíme vacation plugin v Roundcube. V konfiguračním souboru Roundcube main.inc.php změňte $rcmail_config['plugins'] = array();
na $rcmail_config['plugins'] = array('vacation');
A máme hotovo. Celý náš seriál se točí kolem Sendmailu. V tomto případě, ale Sendmail není podmínkou. Může být nahrazen třeba Postfixem, stačilo by jen doladit úložiště emailu v Postfixu a Dovecotu. Roundcube je moderní mailový webový klient, nebojte se jej nasadit.
Užitečné odkazy:
Vacation plugin
Patch pro Outlook
FreeBSD
Dovecot
Roudcube
Roundcube forum, pluginy, skiny, …