Diese Seite beschreibt die Installation und Einrichtung von Horde Webmail unter Debian Bullseye. Eine ältere Version beschreibt die Einrichtung unter Debian Jessie mit vielen Anpassungen.

Installation

Datenbank einrichten

Zuerst muss eine Datenbank angelegt werden - in diesem Beispiel ist es eine Postgres-Datenbank:

Installation

Infos zur Horde-Installation sind im Debian-Wiki zu finden. Ausgangsbasis für die Installation ist die Webmail-Suite:

apt-get install php-horde-webmail php-pgsql php-horde-lz4 php-ssh2 libjs-excanvas libimage-exiftool-perl

Anschließend das Skript webmail-install im Terminal aurufen und alle Schritte durchgehen. Damit es beim Anlegen der Datenbank keine Fehlermeldung gibt1, muss das Paket php5-pgsql vorher installiert werden. Soll eine lokale postgres-Datenbank benutzt werden, muss als Verbindungsart 2 tcp mit 127.0.0.1 ausgewählt werden, da andernfalls ein lokal existierender Nutzer erwartet wird.

Rechte festlegen

Die Konfigurationsdateien liegen unter etc/horde. Die Rechte für dieses Verzeichnis und für die Konfigurationsdateien der einzelnen Anwendungen sollten noch angepasst werden:

chmod -R o-rwx /etc/horde

chown -R :www-data /etc/horde/

chown www-data:www-data /etc/horde/$APP/conf.php

Installation testen

Horde bringt ein Testscript mit, das zahlreiche Informationen über die Installation liefert. Dazu in /etc/horde/horde/conf.php bearbeiten und $conf[testdisable] auf false setzen3. Nun sind die Informationen unter http://$DOMAIN/horde/test.php erreichbar.

Einrichtung

Damit die Ersteinrichtung über das Webinterface funktioniert, muss ein Admin-Nutzer festgelegt werden. Dazu die folgenden Einträge zu /etc/horde/horde/conf.php4 hinzufügen:

$conf['auth']['admins'] = array('your_admin_user');
$conf['auth']['driver'] = 'auto';
$conf['auth']['params']['username'] = 'your_admin_user';
$conf['auth']['params']['password'] = 'your_password';

Allgemeines

Als Admins berechtigte User können umfangreiche Einstellungen direkt nach Anmeldung in Horde vornehmen. Horde schreibt die Änderungen in die entsprechende Konfigdateien. Diese sollten dann aber nicht im Terminal bearbeitet werden, da durch Änderungen im Webinterface die Dateien überschrieben werden.

Um dennoch Änderungen direkt in den Konfigdateien zu ermöglichen, müssen diese als $Dateiname.local.php gespeichert werden. Die .local.php-Dateien sollten nur die geänderten strings enthalten, mehr nicht.

In den entsprechenden Dateien kann festgelegt werden, dass die entsprechende Option in der Weboberfläche nicht änderbar ist. Bsp: $_prefs['from_addr']['locked'] = true;.

Individuelle Nutzereinstellungen speichert Horde im Backend. Werden neue globale Einstellungen eingeführt, müssen die alten Nutzereinstellungen gelöscht werden. Dies geht mit dem entsprechenden sql-Befehl:

DELETE FROM horde_prefs WHERE pref_scope = '<application_name>' AND pref_name = '<preference_name>'

Webserver

Die Apache-Konfigurationsdatei für Horde kann in der default-Version erstmal genutzt werden. Wenn allerdings einige Horde-Links 404-Fehler erzeugen, bspw. beim Speichern von Tasks The requested URL /horde/nag/t/save was not found on this server muss "mod rewrite" aktiviert werden:

a2enmod rewrite

Verbindung zum Mailserver

Nach der Installation greift Horde per IMAP auf den Mailserver zu. Falls dieser nicht auf lokal installiert ist, muss IMP entsprechend konfiguriert werden. Dies geschieht unter /etc/horde/imp/. Dort muss zuerst die Datei backends.local.php angelegt und anschliessend entsprechend gefüllt werden:

<?php
$servers['imap']['disabled'] = false;
$servers['imap']['name']  = 'IMAP Server';
$servers['imap']['hostspec'] = 'dein-imapserver.de';
$servers['imap']['hordeauth'] = 'full';
$servers['imap']['protocol'] = 'imap';
$servers['imap']['port'] = 143;
// Plaintext logins are disabled by default on IMAP servers (see RFC 3501
// [6.2.3]), so TLS is the only guaranteed authentication available by
// default.
$servers['imap']['secure'] = 'tls';

PHP-Einstellungen

Eine weitere Einstellung, damit es beim Upload von großen Mailattachments nicht zu einem session-timeout kommt: Anpassen von /etc/php7.4/apache2/php.ini bzw. in /etc/php7.4/fpm/php.ini bei Verwendung von PHP-FPM:

upload_max_filesize = 30M
post_max_size = 30M
memory_limit = 192M

Außerdem sollte die Standard-Zeitzone für php festgelegt werden, da Horde sich den Wert von dort holt. Ansonsten kann es bspw. zu unterschiedlichen Darstellungen der Zeit im Kalender kommen, wenn Events mit einem externen Programm angelegt werden. Dazu wieder /etc/php7.4/apache2/php.ini bearbeiten und folgende Zeile hinzufügen:

date.timezone = Europe/Berlin

Die Installationshinweise beschreiben die Konfiguration der php Garbage Collection. Bei Debian läuft das anders - kann also ignoriert werden.

PHP-FPM

PHP-FPM ist ein weiterer PHP-Interpreter, der Horde möglicherweise beschleunigt. Die Installation und Einrichtung sind hier ganz gut beschrieben: Link 1 und Link 2.

Zuerst die notwendigen Pakete installieren:

apt-get install apache2-mpm-worker libapache2-mod-fastcgi php-fpm php-apc

Anschließend die entsprechenden Apache-Module aktivieren:

a2enmod actions alias fastcgi rewrite

Die Konfiguration von PHP-FPM liegt unter /etc/php7.4/fpm/pool.d/www.conf und ist nach der Installation schon ganz brauchbar. Die Horde-Apache-Konfiguration muss entsprechend angepasst werden:

<VirtualHost *>
    ServerName webmail.example.org
    ServerAdmin horde@example.org
    SetEnv HTTPS on
    DocumentRoot /usr/share/horde

    <Directory />
        AllowOverride None
    </Directory>
    <Directory /usr/share/horde/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride Limit FileInfo AuthConfig
        Require all granted
    </Directory>

    Include conf-available/php-horde.conf

    ErrorLog ${APACHE_LOG_DIR}/horde.error.log
    LogLevel error
    CustomLog ${APACHE_LOG_DIR}/horde.access.log combined

    <IfModule proxy_fcgi_module>
        <IfModule setenvif_module>
            SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
        </IfModule>

        <FilesMatch ".+\.ph(ar|p|tml)$">
            SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
        </FilesMatch>
        <FilesMatch ".+\.phps$">
            Require all denied
        </FilesMatch>
        <FilesMatch "^\.ph(ar|p|ps|tml)$">
            Require all denied
        </FilesMatch>
    </IfModule>
</VirtualHost>

Horde ignoriert die max_execution_time, die über die php.ini festgelegt wird. Stattdessen wird der Wert 0 durch /usr/share/horde/config/conf.xml gesetzt, um unbegrenzt lange Operationen zu ermöglichen. Dies scheint bei der Verwendung von PHP-FPM allerdings nicht zu funktionieren. So kann bspw. die Synchronisation von großen Kalendern an der zu geringen max_execution_time scheitern. Über die Pool-Konfiguration /etc/php7.4/fpm/pool.d/www.conf kann der Wert erhöht werden:

php_admin_value[max_execution_time] = 120

Standard-Identität mit ldap-Mailkonto verknüpfen

Wir wollen, dass die mit den jeweiligen Anmeldedaten verbundene Mailadresse automatisch zur Standardidentität hinzugefügt wird 5. Dazu müssen wir Horde mitteilen, dass es aus der ldap-Datenbank die entsprechende Mailadresse heraus suchen soll.

Dazu /etc/horde/horde/prefs.local.php bearbeiten:

$_prefs['from_addr']['locked'] = false;
$_prefs['from_addr']['hook'] = true;

Insbesondere für User mit anderen mehreren Maildomains ist es wichtig, dass $_prefs['from_addr']['locked'] = false; gesetzt ist, andernfalls können sie keine weiteren Mail-Adressen in Horde konfigurieren. $conf['user']['verify_from_addr'] = true; sollte in /etc/horde/horde/conf.local.php oder über das Webinterface aktiviert sein.

Anschließend kommt in /etc/horde/horde/hooks.php der eigentliche Code - die $searchBase ist hier nur beispielhaft aufgeführt und muss entsprechend angepasst werden:

    public function prefs_init($pref, $value, $username, $scope_ob)
    {
        switch ($pref) {
        case 'from_addr':

            if (is_null($username)) {
                return $value;
            }

            $ldapServer = 'Adresse_deines_LDAP_Servers';
            $ldapPort = '389';
            $searchBase = 'sc=mailAccount,ou=People,o=server,dc=example,dc=org';

            $ds = @ldap_connect($ldapServer, $ldapPort);

            $searchResult = @ldap_search($ds, $searchBase, 'cn=' . $username);
            $information = @ldap_get_entries($ds, $searchResult);
            if (($information === false) || ($information['count'] == 0)) {
               $user = '';
            } else {
                $user = ($information[0]['mail'][0] != '')
                    ? $information[0]['mail'][0]
                    : $information[0]['cn'][0];
            }

            ldap_close($ds);

            return empty($user)
                ? $username
                : $user;

Adressbuch erstellen

In der Grundkonfiguration gibt es kein persönliches Adressbuch. Ohne Adressbuch lassen sich keine öffentlichen GPG-Schlüssel importieren. Um hier eine Fehlerquelle auszuschließen, legen wir fest, dass ein Standardadressbuch beim ersten Login erstellt wird.

Dazu in der Admin-Weboberfläche unter Administration --> Horde --> Shares die Option $conf[share][auto_create] aktivieren. Um gleichzeitig die Benutzung einzuschränken an selber Stelle $conf[share][no_sharing] aktivieren.

Bei der ersten Einrichtung von Horde kam es vor, dass die GPG-Schlüsselverwaltung nicht verfügbar war, weil in IMP kein Adressbuch als Standard ausgewählt wurde. Um dies automatisch nachzuholen, /etc/horde/imp/prefs.local.php bearbeiten:

$_prefs['add_source']['value'] = 'localsql';

Webmail als Start-Applikation

Normalerweise landet man nach dem Login im Portal. Da wir Horde als reinen Webmailer einsetzen wollen, ist es sinnvoll, direkt in der Mailapplikation zu landen. Einrichtung in /etc/horde/horde/prefs.local.php, den entsprechenden Eintrag suchen und von horde in imp ändern:

$_prefs['initial_application']['value'] = 'imp';

Verschlüsselungsfunktionen einrichten

Die GPG-Schlüssel speichert Horde leider nicht auf Dateiebene, sondern verküpft mit den Adresse in turba in der Datenbank.

Im Webinterface sollte die Schlüssellänge auf 4096 geändert werden. Damit die Schlüsselerstellung nicht ewig dauert, weil auf dem Server nicht genug Zufallsdaten erzeugt werden:

apt-get install haveged

In der Grundkonfiguration erkennt Horde/IMP keine inline-verschlüsselten Mails. Folglich ist auch kein Entschlüsseln möglich. Die früher nutzerbasierte Einstellung kann mittlerweile nur noch zentral vorgenommen werden. Dazu muss /etc/horde/imp/mime_drivers.local.php erstellt und bearbeitet werden:

<?php
$mime_drivers['plain']['pgp_inline'] = true;

Eigene Menüeinträge

Man kann das Applikationsmenü um eigene Einträge ergänzen. Dazu am besten eine php-Datei in /etc/horde/horde/registry.d anlegen:

<?php
header('Content-Type: text/html; charset=UTF-8');

$this->applications['mein_link'] =
array('name' => 'Mein Link', 'status' => 'link', 'url' =>
'https://example.com/mein_link', 'menu_parent' => 'others', 'target' => '_new');

Login-Namen konvertieren

Hordes backend ist unterscheidet Loginnamen nach Groß- und Kleinschreibung. Meldet sich jemand mit seinem sao-Account an und schreibt dabei den ersten Buchstaben groß, werden andere Adressbücher, Notizen und Aufgaben angezeigt, als bei einem komplett klein geschriebenen Loginnamen. Das Backend geht in diesem Fall von unterschiedlichen Accounts aus. Um hier keine Verwirrung zu stiften, weisen wir Horde an, die Loginnamen in Kleinbuchstaben zu konvertieren. Dazu muss /etc/horde/horde/hooks.php bearbeitet werden - der entsprechende hooks ist bereits vorhanden. Es müssen nur die Kommentarzeichen entfernt werden:

public function authusername($userId, $toHorde)
    {
       return $toHorde
            ? Horde_String::lower($userId)
            : $userId;
    }

Anmeldeaufgaben automatisch ausführen lassen

Es gibt keine zentrale Einstellung für die Anmeldeaufgaben. Damit die Hinweismeldungen nach dem Einloggen nicht mehr erscheinen, muss die jeweilige Aufgabe in der entsprechenden Konfigurationsdatei den Status "locked" erhalten.

Weitere Einstellungen im Überblick

Einstellung

Datei

Code

Einstellungen zu vergessenen Passworten ausblenden

/etc/horde/horde/prefs.local.php

$prefGroups['forgotpass']['suppress'] = true;

Papierkorb aktivieren und regelmäßig leeren

/etc/horde/imp/prefs.local.php

$_prefs['use_trash']['value'] = '1';
$_prefs['empty_trash_menu']['value'] = '1';
$_prefs['purge_trash_interval']['value'] = '3';
$_prefs['purge_trash_keep']['value'] = '7';

Geschwindigkeit optimieren

In der Horde-Konfiguration sollten die empfohlenen Caching-Einstellungen aktiviert werden.

memcached einrichten

Memcached Cache-Server zum Hinterlegen und Abholen von Daten aus dem Arbeitsspeicher. Die Nutzung von Horde kann dadurch beschleunigt werden. Zur Installation sind folgende Pakete notwendig:

apt-get install memcached php-memcache php-horde-memcache

Der memcached-Server wird per /etc/memcached.conf eingerichtet. Die Standardeinstellungen können erstmal verwendet werden.

Anschließend muss Horde in der Admin-Oberfläche unter Administration --> Konfiguration --> Horde --> Distributed Hash Table eingerichtet werden. Dort kann unter $conf[hashtable][driver] der Memcache Server ausgewählt und mit den notwendigen Port-Angaben eingerichtet werden. Die Konfigurationsdatei /etc/horde/horde/conf.php sollte anschließend in etwa so aussehen:

$conf['hashtable']['params']['hostspec'] = array('localhost');
$conf['hashtable']['params']['port'] = array('11211');
$conf['hashtable']['params']['weight'] = array();
$conf['hashtable']['params']['persistent'] = false;
$conf['hashtable']['params']['compression'] = false;
$conf['hashtable']['params']['large_items'] = true;
$conf['hashtable']['driver'] = 'Memcache';

Zu beachten ist noch, dass $conf['sessionhandler']['hashtable'] = false gesetzt ist - siehe.

Der Status des Servers lässt sich wie folgt ermitteln:

$ echo stats | nc 127.0.0.1 11211

Was die einzelnen Angaben bedeuten, ist hier recht gut beschrieben.

Rechtschreibprüfung aktivieren

Die Rechtschreibprüfung für das Verfassen von E-Mails kann wie folgt aktiviert werden:

Wichtig ist übrigens, dass die php-Funktion proc_open in der php.ini nicht deaktiviert wurde.

Mailfilterung mit Sieve

Sieve ist eine Skriptsprache, um Filterregeln für Mails zu definieren. Das folgende Beispiel geht davon aus, dass Dovecot mit ManageSieve verwendet wird. Die Einrichtung wird hier gut beschrieben.

In Horde ist die App Ingo für die Filterung zuständig. Damit Ingo mit dem ManageSieve-Daemon kommunizieren kann, muss die Date /etc/horde/ingo/backends.local.php erstellt werden:

<?php

/* IMAP */
$backends['imap']['disabled'] = true;
/* Sieve */
$backends['sieve']['disabled'] = false;
$backends['sieve']['transport'][Ingo::RULE_ALL]['driver'] = 'timsieved';
$backends['sieve']['transport'][Ingo::RULE_ALL]['params']['hostspec'] = 'localhost';
$backends['sieve']['transport'][Ingo::RULE_ALL]['params']['logintype'] = 'PLAIN';
$backends['sieve']['transport'][Ingo::RULE_ALL]['params']['usetls'] = false;
$backends['sieve']['transport'][Ingo::RULE_ALL]['params']['port'] = 4190;
$backends['sieve']['transport'][Ingo::RULE_ALL]['params']['scriptname'] = 'ingo';
$backends['sieve']['transport'][Ingo::RULE_ALL]['params']['debug'] = false;
$backends['sieve']['script'][Ingo::RULE_ALL]['driver'] = 'sieve';
$backends['sieve']['script'][Ingo::RULE_ALL]['params']['utf8'] = true;
$backends['sieve']['shares'] = false;

In diesem Beispiel wird keine TLS-Verbindung zwischen Ingo und ManageSieve benötigt, da beide lokal laufen. Dovcecot muss natürlich entsprechend eingerichtet sein, um PLAIN-Authentifikation ohne TLS zuzulassen - /etc/dovecot/conf.d/10-auth.conf:

disable_plaintext_auth = yes

...

remote 127.0.0.1 {
disable_plaintext_auth = no
}

Spracheinstellungen

Passwortverwaltung

Um Passworte mit Horde ändern zu können, muss php-horde-passwd installiert sein. Das es verschiedene Backends zur Konfiguration des Passwortes unterstützt, muss es natürlich entsprechend eingerichtet werden. Im Folgenden eine Beispielkonfiguration für das LDAP-Backend. Zuerst muss die Datei /etc/horde/passwd/backends.local.php angelegt werden. Anschließend wird die Verbindung zum LDAP-Server konfiguriert:

<?php
$backends['ldap']['disabled'] = false;
$backends['ldap']['name'] = 'LDAP Server';
$backends['ldap']['driver'] = 'Ldap';
$backends['ldap']['policy']['minLength'] = 8;
$backends['ldap']['policy']['minNumeric'] = 1;
$backends['ldap']['params']['host'] = 'dein_ldap.server';
$backends['ldap']['params']['port'] = 389;
$backends['ldap']['params']['basedn'] = 'sc=mailAccount;ou=People;o=server;dc=example;dc=org';
$backends['ldap']['params']['uid'] = 'cn';
$backends['ldap']['params']['attribute'] = 'userPassword';
$backends['ldap']['params']['realm'] = '';
$backends['ldap']['params']['filter'] = '(objectClass=mailAccount)';
$backends['ldap']['params']['encryption'] = 'ssha';
$backends['ldap']['params']['tls'] = false;

Verwaltung

Account löschen

Horde speichert diverse Nutzerdaten in der eigenen (mysql)Datenbank. Wird ein Account entfernt, sollten die Daten aus der Datenbank gelöscht werden

horde-remove-user-data USERNAME


Fehler


Fussnoten, Hinweise und Links

  1. Fehlermeldung: Could not instantiate PDO. PDOException: could not find driver (1)

  2. How should we connect to the database? (2)

  3. Nach dem Testen unbedingt wieder deaktivieren (3)

  4. Normalerweise werden Änderungen in $DATEI.local.php geschrieben - für diese einmalige Änderung ist das direkte Bearbeiten in Ordnung (4)

  5. andernfalls können die Nutzer*innen in der Grundkonfiguration keine Mails versenden (5)

  6. /usr/share/php/Horde/Crypt/Pgp.php (6)

Horde unter Debian installieren (zuletzt geändert am 2022-01-23 11:54:04 durch anonym)


Creative Commons Lizenzvertrag
This page is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.