Vytváříme webmail s rozhraním Roundcube

22. 10. 2009
Doba čtení: 8 minut

Sdílet

Ilustrační obrázek
Autor: Depositphotos – stori
Ilustrační obrázek
Neomezený přístup k e-mailům je dnes vyžadován téměř od všech uživatelů. Například v době dovolených, kdy sebou nechceme tahat notebook s celou naší kanceláří, může se hodit přístup k poště přes www rozhraní. A takových nástrojů je mnoho: Horde, Squirrelmail, Openwebmail nebo třeba Roundcube.

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.

Roundcube
Roundcube
Roundcube

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');

bitcoin_smenarna

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, …

Autor článku

Petr Macek studoval aplikovanou informatiku na Jihočeské univerzitě, pracuje jako síťový specialista ve firmě Kostax, s. r. o. Baví ho především FreeBSD, sítě a monitoring Cacti.