Linux

Courier-MTA

Die Konfiguration von Courier-MTA als POP3/SMTP-Server für lokale Testzwecke ist grundsätzlich nicht schwierig, es gibt nur leider sehr wenige brauchbare und vor allem kurze HowTos dazu - Das mag wohl daran liegen dass in den meisten Fällen von Produktivmaschinen mit IMAP bzw. in Kombination mit Postfix ausgegangen wird.

Auth-Daemon Konfiguration:

/usr/local/etc/authlib/authdaemonrc

authmodulelist="authmysql"
daemons=2
authdaemonvar=/usr/local/var/spool/authdaemon
DEBUG_LOGIN=1
DEFAULTOPTIONS="disablewebmail=1,disableimap=1"
LOGGEROPTS=""

/usr/local/etc/authlib/authmysqlrc

MYSQL_SERVER 127.0.0.1
MYSQL_USERNAME courier_mta
MYSQL_PASSWORD [pwd]
MYSQL_SOCKET /var/lib/mysql/mysql.sock
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE courier_mta
MYSQL_USER_TABLE mail_users
MYSQL_LOGIN_FIELD username
MYSQL_CRYPT_PWFIELD pwd_crypt
MYSQL_CLEAR_PWFIELD pwd_clear
MYSQL_UID_FIELD uid
MYSQL_GID_FIELD gid
MYSQL_NAME_FIELD fullname
MYSQL_HOME_FIELD home
MYSQL_QUOTA_FIELD quota
MYSQL_AUXOPTIONS_FIELD auxoptions
DEFAULT_DOMAIN test.rh

Erweiterung für Catch-All-Funktionen

Eine geniale Möglichkeit ist es die verwendeten Querys selbst anzupassen (Das Beispiel ist als eine zusammenhängende Zeile in der „/usr/local/etc/authlib/authmysqlrc“ zu sehen.

Damit kann zB ein Benutzer regulär angelegt und ein zusätzlicher Eintrag mit „*.@domain“ für alle nicht definierten Adressen mit der gleichen Home-Angabe fängt alles was kein eigenes Postfach hat ab. So lassen sich auch verschiedene Domains komplett auf einen einzigen Account umleiten.

MYSQL_SELECT_CLAUSE SELECT username,pwd_crypt,pwd_clear,uid,gid,home,'',quota,fullname,auxoptions FROM mail_users WHERE (username='$(local_part)@$(domain)' and pwd_crypt!='') or username='*@$(domain)';

MySQL-Benutzertabelle

Passwörter sind beim Hinzufügen von Benutzern im Feld „pwd_crypt“ mittels „crypt pwd“ auf der Kommandozeile zu verschlüsseln. Auf Unix-Rechnern kann das auch ein PHP-Skript mit dem Kommando crypt('mypwd')

Die Felder „uid“ und „gid“ sind mit den entsprechenden System-IDs des Courier-Daemons zu versehen, ansonsten funktioniert das Ganze schlichtweg nicht und kostet Zeit und Nerven.

create table mail_users
(
auto_id mediumint(6) unsigned not null auto_increment,
username varchar(255) collate latin1_german1_ci not null,
pwd_crypt varchar(255) collate latin1_german1_ci not null,
pwd_clear varchar(255) collate latin1_german1_ci not null,
uid mediumint(6) unsigned not null,
gid mediumint(6) unsigned not null,
fullname varchar(255) collate latin1_german1_ci not null,
home varchar(255) collate latin1_german1_ci not null,
quota varchar(255) collate latin1_german1_ci not null,
auxoptions varchar(255) collate latin1_german1_ci not null,
primary key (auto_id)
)
engine=MyISAM default charset=latin1 collate=latin1_german1_ci

Zertifikate für den Server erstellen

Dies wird dann benötigt wenn der Client versucht sich per TLS zu Authentifizieren, die Warnung des Clients im Bezug auf das Zertifikat kann ignoriert werden. Je nach Konfiguration der einzelnen Dienste ist die Verschlüsselung optional oder verpflichtend - Beispielsweise der Parameter "ESMTP_TLS_REQUIRED" in der Datei "/usr/lib/courier/esmtpd"

Die Angaben für die Zetifikat-Inhalte erfolgen in folgenden Dateien:
/usr/lib/courier/etc/imapd.conf
/usr/lib/courier/etc/pop3d.conf
/usr/lib/courier/etc/esmtpd.conf

Folgende Kommandos erstellen die Zertifikate unter "/usr/lib/courier/share/":
/usr/lib/courier/share/mkesmtpdcert
/usr/lib/courier/share/mkimapdcert
/usr/lib/courier/share/mkpop3dcert

Dienste starten und beenden

Wenn man den Server selbst kompiliert hat und sich nicht mit den rc.d-Skripts quälen will bietet es sich an eigene Skripts zu definieren und per „/etc/rc.d/rc.local“ zu starten bzw. beim Shutdown im Skript „/etc/rc.d/init.d/killall“ zu beenden.

SMTP/POP3 starten

/usr/local/sbin/authdaemond start
/usr/lib/courier/sbin/courier start
/usr/lib/courier/sbin/pop3d start
/usr/lib/courier/sbin/esmtpd start

SMTP/POP3 beenden

/usr/local/sbin/authdaemond stop
/usr/lib/courier/sbin/courier stop
/usr/lib/courier/sbin/pop3d stop
/usr/lib/courier/sbin/esmtpd stop

Konfiguration

Weitere Konfigurationen erfolgen unterhalb von „/usr/lib/courier/etc/“ und hier soll nur von einem lokalen Testserver mit einer eigenen Domain ausgegangen werden.

In den meisten Fällen gibt es beim Courier-MTA ein Kommando welches nach Änderungen an Konfigurationsdateien auszuführen ist (Dies liegt an der internen Struktur in Datenbank-Dateien).

Akzeptierte Domains festlegen

echo "test.rh" >> /usr/lib/courier/etc/esmtpacceptmailfor.dir/domainlist.txt
/usr/lib/courier/share/makeacceptmailfor
echo "test.rh" >> /usr/lib/courier/etc/hosteddomains/domainlist.txt
/usr/lib/courier/share/makehosteddomains

Hier bietet sich natürlich ein Skript mit Eingabeaufforderung an welches wie unter „Aliase“ beschrieben auch gleich Catch-All-Einträge in der Datenbank erzeugt.

Mail-Ordner erzeugen

Als "home" wird „/home/courier/rhsoft/“ für die Adresse „rhsoft@test.rh“ angenommen. Auf diesen und sämtliche Unterordner benötigt der Benutzer unter dem der Mailserver läuft Schreibrechte (In der Regel „courier“).

Bei der Verwendung von „mysqlauth“ bietet es sich an unter „/home/courier/“ die Mailordner für die einzelnen virtuellen Benutzer zu erzeugen. Bei entsprechender Rechtevergabe lassen sich diese mit dem MySQL-Eintrag per PHP-Skript erstellen.

mkdir /home/courier/rhsoft/
mkdir /home/courier/rhsoft/Maildir/
mkdir /home/courier/rhsoft/Maildir/cur/
mkdir /home/courier/rhsoft/Maildir/new/
mkdir /home/courier/rhsoft/Maildir/tmp/
chown -R courier /home/courier
chgrp -R courier /home/courier
chmod -R 750 /home/courier

Aliase

Bei Verwendung von „mysqlauth“ ist das Anlegen von Alias-Adressen denkbar einfach indem es mehrere Einträge mit dem gleichen „home“ gibt (Für diese ist kein Passwort nötig).

Mit der oben beschriebenen Erweiterung der „„/usr/local/etc/authlib/authmysqlrc“ lassen sich damit „*@domain“-Adressen problemlos realisieren.

Fehlerbehebung

Wenn das Zustellen aufgrund eines Konfigurationsfehlers nicht funktioniert wird eine Adresse deaktiviert. Unter „/usr/lib/courier/var/track“ liegende Dateien können wie die Inhalte der Ordner „/usr/lib/courier/var/msgs“ und „/usr/lib/courier/var/msgq“ gelöscht werden.

Zugriff beschränken

In der Datei „/usr/lib/courier/etc/smtpaccess/default“ werden Policies angegeben welche IPs SMTP-Zugriff haben. Nach Änderungen das Kommando „/usr/lib/courier/share/makesmtpaccess“ ausführen.

Courier-MTA selbst kompilieren

Eigentlich sollte laut Entwickler auf Fedora problemlos das RPM selbst gebaut werden können, bei mir funktionierte dies nicht wirklich - Mit ein paar Anlaufschwierigkeiten lässt sich der Server aber problemlos selbst kompilieren.

  • Im Vorfeld sollte das Paket "openssh-perl" (yum -y install openssh-perl) installiert werden welches nach einigem Suchen die vom Configure-Skript bemängelte "c_rehash" enthält.
  • Es werden sowohl "courier" als auch "courier-authlib" von http://www.courier-mta.org/download.php benötigt.
  • Beim Beispiel wird davon ausgegangen dass beide unter "/usr/src/" in den Ordnern "courier" und "courier-authlib" ohne Versionsangabe entapckt werden.
  • das Paket "mysql-devel" ist ggf. im Vorfeld zu installieren, es sei denn MySQL wird auf dem Rechner selbst aus den Quellen gebaut (wie bei mir), dann kann dies entfallen.
  • Das Build-Script muss als normaler Benutzer gestartet werden und verweigert als root den Dienst!
Build-Script

#! /bin/bash

cd /usr/src/courier-authlib/

CFLAGS="-march=i686" ./configure --with-redhat && make && sudo make check && sudo make install && sudo make clean > /dev/null

cd /usr/src/courier/

CFLAGS="-march=i686" ./configure --with-redhat --without-ispell && make && sudo make check && sudo make install && sudo make clean > /dev/null