Mac als Mail-Server und Spamfilter

Seite 7: fetchmail

Inhaltsverzeichnis

Wenn die Mails wie erwünscht in den IMAP-Ordnern landen, kann man den letzten Teil des Mail-Servers einrichten, nämlich das Abholen von E-Mails aus externen POP3-Postfächern; der Rest des Zustellmechanismus ist fertig.

POP3-Postfächer lassen sich mit verschiedenen Programmen leeren. Wir setzen Fetchmail ein, weil Mac OS X dieses Programm bereits mitbringt. Die Abholeinstellungen legt man in der User-Datei .fetchmailrc fest.

cd ct-Mac-Mail-Server/Fetchmail 
cp dot-fetchmailrc /Users/JoeUser/.fetchmailrc

Fetchmail kann sowohl POP3- als auch IMAP-Postfächer abrufen. Mit einige Skripten lässt sich die Post von mehreren Usern in einem Rutsch abholen.

Im mitgelieferten Beispiel werden die Nachrichten von den POP3-Postfächern zwar abgeholt, aber anschließend nicht gelöscht (Parameter keep). Es empfiehlt sich, diese Einstellung zumindest so lange beizubehalten, bis man Gewissheit hat, dass SpamAssassin keine erwünschten Mails löscht. Fetchmail erfasst in der Datei ~/.fetchids, welche Nachrichten es bereits abgeholt hat, sodass es diese bei der nächsten Verbindung nicht erneut abholt.

Wenn auf dem Server des Providers der Platz während der Erprobungsphase knapp wird, kann man per Mail-Client auf das Postfach zugreifen und überflüssige Nachrichten entfernen. Wenn sich der Abholmechanismus bewährt hat, kann man Fetchmail die Nachrichten direkt beim Abholen löschen lassen – oder eben doch behalten, wenn man auf ein externes Nachrichten-Backup auf dem Server des Providers Wert legt. Eine Beispielkonfiguration sieht so aus (alle Angaben erwartet Fetchmail in einer Zeile):

poll "mail.netbeat.de" protocol POP3 uidl user "Joe.User@amanadiseas.de"
password "geheim" is "dz" here keep

Dabei stellt Fetchmail Nachrichten, die beim Provider Netbeat an das POP3-Beispielkonto Joe.User@amanadiseas.de geschickt wurden, dem lokalen User dz zu. Weitere Fetchmail-Optionen, etwa Eingrenzen der Verbindungen auf ein bestimmtes Netzwerk-Interface, um Modem- oder Mobilfunkverbindungen zu vermeiden oder auch Beschränkungen hinsichtlich des Zeitpunkts Abrufe, kann man den Fetchmail-Man-Pages entnehmen.

Bei der Implementierung des Fetchmail-Dienstes gab es ein kleines Problem zu lösen: Die Software holt nicht von sich aus Nachrichten für jeden User nach einem Neustart des Rechners ab – Fetchmail ist nur als einfaches Kommandozeilenprogramm ausgelegt und nicht als Dienst. Mittels zweier Dateien – einem Shell-Skript und einem LaunchDaemon – lässt sich diese Funktion aber nachrüsten. Das Skript fetchmail_runner startet Fetchmail, und dieses klappert die in den .fetchmailrc-Dateien definierten Postfächer ab. Der Parameter -t legt fest, wie lange es auf die Antwort des Servers wartet, bevor es aufgibt (im Beispiel 45 Sekunden).

Auch ist dort festgelegt, welche weiteren Startparameter es nutzt und wo es sein Protokoll ablegt (/var/log/fetchmail.log). Darüber hinaus erschlägt das Skript ein Problem: Fetchmail ist so ausgelegt, dass es nur in dem User-Kontext läuft, von dem aus es gerade aufgerufen wurde – von Haus aus kann es also nicht als einzelner Service laufen, der unter verschiedenen Kontexten die Post für alle User abholt.

Genau das ermöglichten bereits einige für Linux entwickelte Shell-Skripte. Anhand der separaten User-Datenbank /etc/fetchmail.users starten sie Fetchmail mehrfach unter den angegebenen User-Kontexten. Für den Mac haben wir ein solches Skript geringfügig angepasst; die wichtigsten Funktionen stecken in den beiden Zeilen for username in `cat $USERDB`; do und su - $username -c `/usr/bin/fetchmail …. Mithin bezieht jede Fetchmail-Instanz ihre Einstellungen aus der .fetchmailrc-Datei des jeweiligen Users.

Weil so jeder User den Inhalt seiner .fetchmailrc selbst anpassen kann (etwa mit dem grafischen Frontend fetchmailconf), erspart das dem Administrator die Kleinarbeit. Auch setzen die User die Kennungen für den Mail-Abruf selbst in ihre .fetchmailrc ein und müssen sie nicht dem Administrator anvertrauen. Das wäre aber nötig, wenn Fetchmail für alle User eine gemeinsame .fetchmailrc nutzen und mit Root-Rechten laufen würde.

Den fetchmail_runner startet der fetchmail-LaunchDaemon alle 360 Sekunden. Die Datenbank fetchmail.users ist eine einfache Textdatei, in die der Root die User-Kürzel einträgt, die den POP3-Dienst nutzen wollen.

Kopieren Sie also den fetchmail_runner-LaunchDaemon, fetchmail.users und das Skript fetchmail_runner mit Root-Rechten in die jeweiligen Ordner (/Library/LaunchDaemons, /etc und /usr/local/sbin). Stellen Sie sicher, dass /usr/local/sbin/fetchmail_runner ausführbar ist (chmod +x). Die Zugriffsrechte für /etc/fetchmail.users sollten auf root:wheel eingestellt sein.

Damit alle fetchmail-Instanzen in /var/log/fetchmail.log schreiben können, muss die Datei eigens angelegt und mit Rechten versehen werden, die auch Schreibzugriffe für die niedrig privilegierten User-Kontexte aus /etc/fetchmail.users erlauben. Dafür sind explizit Root-Rechte erforderlich, weil im Verzeichnis /var/log von Haus aus nur Root schreiben darf:

su 
touch /var/log/fetchmail.log
chmod o+w /var/log/fetchmail.log
exit

Nun kann man den fetchmail_runner-Dienst starten:

sudo launchctl load -w \ /Library/LaunchDaemons/fetchmail_runner.plist 
sudo launchctl start fetchmail_runner

Um zu prüfen, ob fetchmail läuft, sollte man nicht das Kommando ps verwenden, weil das Programm nur kurz alle fünf Minuten aufgerufen wird. Ob es gelaufen ist, verrät aber die Protokolldatei /var/log/fetchmail.log. Falls die konstant leer bleibt, empfiehlt es sich, im console.log nach Fehlerhinweisen zu suchen. Beispielsweise weigert sich fetchmail zu laufen, wenn in /etc/fetchmail.users fehlerhafte Einträge vorhanden sind (Username nicht vorhanden oder falsch geschrieben) oder die Datei riskante Zugriffsrechte aufweist (in diesem Fall mit chmod 0710 .fetchmailrc herabsetzen).