Lokaler Mailserver mit sendmail und fetchmail
userdb zur Adresskorrektur (Header-Rewriting)
Die Datenbank für die Zuordnung der Email-Adressen zu den lokalen Benutzernamen und umgekehrt sollte wie folgt aussehen: Für jeden Benutzer werden zwei Zeilen in der Text-Datei /etc/mail/userdb mit folgender Syntax definiert:
lokaler Loginname:mailname Email-Adresse Email-Adresse:maildrop lokaler Loginname
Beispiel:
# /etc/mail/userdb martig:mailname stefan.martig@rhone.ch stefan.martig@rhone.ch:maildrop martig
Für Sendmail muss diese Textdatei in ein verständliches Datenbank-Format umgewandelt werden:
makemap btree /etc/mail/userdb.db < /etc/mail/userdb
Testen der Konfiguration
Nun sollte man Sendmail dazu bringen, die Konfigurationsdateien neu einzulesen, damit man einige Tests machen kann. Mit dem folgenden Befehl geschieht dies:
killall -HUP sendmail
Die Umsetzung der lokalen Namen mit der userdb.db-Datei kann nun wie folgt geprüft werden (kontrollieren Sie auch unbedingt, ob root tatsächlich lokal abgearbeitet wird, ansonsten erreicht den root niemand mehr und Sie als Systemadministrator werden auch keine Meldungen von Daemonen etc. erhalten :-)
/usr/sbin/sendmail -bv stefan.martig@rhone.ch /usr/sbin/sendmail -bv martig /usr/sbin/sendmail -bv root /usr/sbin/sendmail -bv martig@oc.ch /usr/sbin/sendmail -bv root@oc.ch
Die Ausgabe sollte folgendermaßen aussehen:
stefan.martig@rhone.ch... deliverable: mailer relay, host rhone.ch,user stefan.martig@rhone.ch
Der Parameter -d zeigt ausführliche Informationen zur Abarbeitung der Konfiguration. Interessant ist hierbei, ob es auch in der Userdb nachschaut. Es läßt sich schön mit Hilfe von grep ausfiltern:
/usr/sbin/sendmail -bv -d stefan.martig@rhone.ch | grep udbmatch
Es erscheint dann folgendes:
udbmatch(martig, mailname) udbmatch ==> stefan.martig@rhone.ch
Mail ins Internet schicken mit Sendmail
Sendmail sollte nun einsatzbereit sein. Wir können einen ersten Versuch starten, lokale Mail herumzuschicken. Dafür dient der folgende Befehl (führen Sie ihn als normaler User aus):
echo "TEST2user" | /usr/sbin/sendmail heinzen echo "TEST2root" | /usr/sbin/sendmail root
Sendmail greift hier nur auf die lokalen Spool-Verzeichnisse zu, eine Internetverbindung sollte nicht initiiert werden. Kommt nach wenigen Sekunden eine Email an (wovon man ausgehen kann), ist der Test erfolgreich. Ob die externen Mails auch funktionieren, läßt sich folgendermaßen überprüfen:
echo "TEST2isp" | /usr/sbin/sendmail stefan.martig@rhone.ch
Dabei passiert vorerst mal nichts, denn diese Email wurde gespoolt und soll auch solange im Spoolverzeichnis bleiben, bis eine Verbindung zum Internet besteht. Ansehen lässt sich die Mailqueue mit dem Kommando:
/usr/bin/mailq
Nun sollte eine Liste mit allen gespoolten Mails ausgegeben werden.
Mails an Mailserver übergeben
Sie können nun eine Verbindung zum Provider aufbauen und mit /usr/sbin/sendmail -q Sendmail anweisen, die Emails aus dem lokalen Spoolverzeichnis an den Mailserver des Providers zu übergeben.
Mail vom Internet holen mit Fetchmail
Fetchmail ist ein POP- und IMAP-Client, der auf der DLD 5.3 schon drauf ist, daher haben wir uns fuer dieses Programm zum Abholen der Email vom Provider entschieden. Die Konfigurationsdatei /root/.fetchmailrc sieht wie folgt aus:
poll mail.rhone.ch protocol POP3 user stefan.martig password abcdef is martig poll mail.rhone.ch protocol POP3 user matthias.heinzen password ghijklm is heinzen poll mail.gmx.net protocol POP3 user stefan_martig password nopqrs is martig
Nach user steht der Name beim Provider (wie bei fetchmail -u ...), und hinter is ... steht der Loginname auf der lokalen Maschine, also das Postfach, in das fetchmail die Mail ablegen soll. Diese Datei darf nur für den Benutzer lesbar sein, der die Mails abholt, da sie die Paßwörter im Klartext enthält. Also:
chmod 600 /root/.fetchmailrc
Die vorgestellte Lösung ist nicht besonders elegant, da der Administrator von jedem Benutzer das Passwort beim Provider wissen muss und der Benutzer jedes Ändern, Löschen oder Hinzufügen von neuen Accounts dem Postmaster melden muss, damit er die Datei /root/.fetchmailrc anpassen kann. Eine probate Moeglichkeit wäre ein kleines Perl-Skript, das, von root gestartet, fetchmail für jeden User ausführt und dabei sein lokales /home/user/.fetchmailrc als Konfiguration nimmt. Aber das ist noch Zukunftsmusik und ich ziehe es vor, eine genaue Kontrolle in der Anfangsphase zu haben :-) Mit
/usr/local/bin/fetchmail -a -k
werden nun alle (Option -a) noch beim Provider befindlichen Emails übertragen (auch die alten), wobei die Option -k fetchmail veranlasst, die Mails beim Provider nicht zu löschen (wir testen ja noch!). Die abgeholten Mails werden nun in den entsprechenden Postfächern abgelegt und können mit einem Mailreader gelesen werden.
Automatisierung
Bisher haben wir den gesamten Mailverkehr manuell geregelt. Nun sollte aber ein Mailserver autonom handeln. Es gibt verschiedene Möglichkeiten, den Mailserver zum automatischen Versenden und Abholen von Emails beim Provider zu veranlassen. Hier ist eine davon:
Abliefern beim Provider
sendmail -q: Dieser Befehl sollte sowohl unmittelbar nach Verbindungsaufbau als auch vor dem Verbindungsabbau ausgeführt werden, um die geschriebenen Emails an den Mailserver des Providers zu übergeben. Bei unserem System wird dies durch ein Einfügen von sendmail -q in das Skript /etc/ppp/ip-up und /etc/ppp/ip-down erledigt. Ferner garantiert der als Daemon laufende Sendmail ein ständiges Leeren der MailQueue während dem Verbundensein mit dem Internet. Wenn der Rechner nicht mit dem Internet verbunden ist, so läßt er die externe Post liegen und bearbeitet nur die lokale Post (mit den EXPENSIVE Einträgen in der sendmail.mc oben).
Abholen beim Provider
Ebenfalls im Skript /etc/ppp/ip-up wird dann Fetchmail als Daemon (Option -d 900, d.h. im Hintergrund) unmittelbar nach dem Verbindungsaufbau zum Provider gestartet; nun wird alle 900 Sekunden nach neuen Mails geschaut und gegebenenfalls übertragen (-a).
/usr/local/bin/fetchmail -d 300 -a
Wird die Verbindung mit dem Provider gestoppt, bietet es sich an, die beiden folgenden Befehle in das Skript /etc/ppp/ip-down aufzunehmen:
/usr/local/bin/fetchmail --quit /usr/local/bin/fetchmail -a
Hierbei wird der aktuelle fetchmail-Prozeß (--quit) zunächst gekillt und daraufhin alle noch beim Provider befindlichen Emails übertragen (-a), ohne daß Fetchmail als Daemon im Hintergrund läuft.
Der automatische Postbote
Die beiden Skripte sehen dann etwa so aus:
#!/bin/sh # /etc/ppp/ip-up /sbin/route add -net default ippp0 /usr/sbin/sendmail -q /usr/bin/fetchmail -d 900 -a -L /var/log/fetchmail
#!/bin/sh # /etc/ppp/ip-down /usr/sbin/sendmail -q /usr/bin/fetchmail --quit /sbin/route add -net default ippp0

