31.
August
2010
Nach dem gestrigen Beitrag wie man Postfix installiert und E-Mails über einen Smarthost versenden kann, geht es heute mit dem eigenen IMAP-Server und dem Abrufen von bestehenden E-Mailkonten weiter.
Der IMAP-Server wird die auf dem System liegenden Mails für einen Client zur Verfügung stellen, ein anderes Programm (fetchmail) läd derweil die E-Mails von den Servern und sortiert sie über procmail dem Postfach zu. Damit alles schön automatisch abläuft gehört natürlich auch noch ein entsprechender Eintrag in der crontab dazu.
Nach dem Überblick was auf dieser Seite zu finden ist nun aber gleich weiter mit dovecot als IMAP-Server.
Anstatt mich wieder mit Courier zu plagen bin ich den Tipps gefolgt, welche dovecot als IMAP-Server empfehlen. Leider sind viele Anleitungen nicht mehr ganz aktuell und das zur Installation benannte Paket »dovecot« führt nur zu einer Fehlermeldung:
Paket dovecot ist nicht verfügbar, wird aber von einem anderen Paket
referenziert. Das kann heißen, dass das Paket fehlt, dass es veraltet
ist oder nur aus einer anderen Quelle verfügbar ist.
Doch die folgenden Pakete ersetzen es:
dovecot-common
E: Paket dovecot hat keinen Installationskandidaten
Immerhin wird man darauf hingewiesen, wie der korrekte Paketname für die Installation lautet. Da der Server IMAP zur Verfügung stellen soll, wird das dafür benötigte Paket gleich in einem Rutsch installiert:
apt-get install dovecot-common dovecot-imapd
Die folgenden Schritte basieren auf der englischsprachigen Anleitung Set Up a Debian or Ubuntu Machine as a Maildrop und sind nur im Detail abgewandelt.
Nach der Installation von dovecot muss die Konfiguration durch Änderung in der Konfigurationsdatei /etc/dovecot/dovecot.conf auf IMAP umgestellt werden. Der entsprechende Block sieht wie folgt aus:
# Protocols we want to be serving: imap imaps pop3 pop3s managesieve
# If you only want to use dovecot-auth, you can set this to "none".
#protocols = imap imaps
Da ich eine sichere Verbindung mittels IMAP über SSL installieren wollte, gab ich imaps als einzig gültiges Protokoll an:
protocols = imaps
Damit IMAP über SSL funktioniert, muss noch ein entsprechendes Zertifikat erstellt werden. Den Aufruf habe ich von der bereits verlinkten Anleitung übernommen:
openssl req -new -x509 -nodes -out /etc/ssl/certs/dovecot.pem
-keyout /etc/ssl/private/dovecot.pem -days 5000
Der Aufruf ist natürlich in einer Zeile zu schreiben und wurde hier nur wegen der beschränkten Breite umbrochen.
Der Aufruf verlangt ein paar Angaben, welche für die Erstellung des Zertifikats notwendig sind. So muss beispielsweise der Name eingegeben werden. Bei »common name« sollte der Hostname (mitsamt Domain sofern existent) angegeben werden. Die geforderte E-Mailadresse sollte ebenfalls gültig sein.
Die Angabe das Zertifikat sei für 5'000 Tage gültig sorgt dafür, dass das Zertifikat erst nach über 13 Jahren ungültig wird. Bis dahin wird der Mailserver vermutlich schon einige Jahre lang nicht mehr laufen.
Sofern dovecot noch nicht läuft kann es durch die Eingabe dovecot gestartet werden.
Ob dovecot läuft und wie gewünscht auch per IMAPS über den Port 993 erreichbar ist, kann über eine Verbindung mittels openssl überprüft werden:
openssl s_client -connect localhost:993
Nach einigen Informationen zum Zertifikat meldet sich dovecot und wartet auf eine Eingabe:
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE AUTH=PLAIN
] Dovecot ready.
Durch die Abfrage zu was dovecot in der installierten Version fähig ist meldet sich der Server entsprechend zurück:
1 CAPABILITY
Sollte eine ähnliche Rückgabe wie bei mir zur Folge haben:
* CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISP
LAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE U
IDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHI
N CONTEXT=SEARCH AUTH=PLAIN
1 OK Capability completed.
Nachdem alles wie gewünscht funktioniert kann die Verbindung zum Server beendet werden:
2 LOGOUT
Sollte der Server nicht nur lokal sondern auch von anderen Rechnern im Netzwerk genutzt werden können, ist der Port 993 bei den Firewall-Regeln entsprechend freizugeben.
Bereits jetzt sollte der IMAP-Server über einen beliebigen Client mit einem gültigen Benutzernamen des Linuxsystems aufgerufen und sich mit den Zugangsdaten eingeloggt werden können.
Zunächst die Variante, bei welcher fetchmail einfach an der Kommandozeile aufgerufen wird. Weiter unten auf der Seite erläutere ich auch die Variante fetchmail als Daemon im Hintergrund laufen zu lassen.
Die E-Mails werden von Mailservern per POP3 heruntergeladen und sollen anschließend in Verzeichnisse sortiert werden. Auch die Überprüfung auf Viren und Spam ist möglich. fetchmail übergibt dabei die E-Mails an procmail, welche die Verteilung übernimmt. Zunächst jedoch nur wie fetchmail eingerichtet werden kann.
fetchmail -kv -m "/usr/bin/procmail -d %T"
Wenn alles läuft wie gewünscht kann die Option -k weggelassen werden:
fetchmail -v -m "/usr/bin/procmail -d %T"
Die Option -k steht für »keep« und wird in der Anleitung mit »Don’t delete seen messages from server« beschrieben. Erhalten bleibt -v, da die Ausgabe weiterhin »verbose« stattfinden soll.
Wird aus dem -kv ein -v, werden E-Mails auf dem Server gelöscht sobald sie heruntergeladen wurden.
In manchen Anleitungen ist die Option -K angegeben. Mit versalem »K« wird fetchmail dazu »gezwungen« bereits heruntergeladene E-Mails löschen. Da dies auch ohne diese Option der Fall ist, habe ich kein -K im Aufruf. Dies sei nur am Rande erwähnt. Der Vollständigkeit halber noch die Dokumentation der beiden Optionen:
-k | --keep
(Keyword: keep) Keep retrieved messages on the remote mailserver. Normally,
messages are deleted from the folder on the mailserver after they have been
retrieved. Specifying the keep option causes retrieved messages to remain
in your folder on the mailserver. This option does not work with ETRN or ODMR.
-K | --nokeep
(Keyword: nokeep) Delete retrieved messages from the remote mailserver. This
option forces retrieved mail to be deleted. It may be useful if you have
specified a default of keep in your .fetchmailrc. This option is forced on
with ETRN and ODMR.
Einige Anleitungen geben an, dass man den Abruf seiner Postfächer in der Datei /etc/fetchmailrc angeben soll. Dies macht meiner Meinung nach jedoch wenig Sinn, da ich als Benutzer die Angaben über meine E-Mailaccounts in meinem Verzeichnis haben sollte.
Daher ist bei mir die eben genannte leer beziehungsweise nicht vorhanden. Alle Angaben für fetchmail befinden sich bei mir in der ~/.fetchmailrc.
Die Zugangsdaten für den Abruf der E-Mails werden in dieser Datei samt Passwort im Klartext eingegeben. Daher sollten nach dem Erzeugen der Datei die Leserechte entsprechend angepasst werden.
Der Aufbau eines Aufrufs ist sehr simpel:
poll SERVER with protocol POP3 user "USERNAME" there with password "PASSWORD" options ssl
Dabei sind natürlich die Angaben entsprechend zu ersetzen: »SERVER« bezeichnet die Adresse des Mailservers, von welchem die E-Mails abgerufen werden sollen. »POP3« das Protokoll, über welches die Verbindung zum eben genannten Server aufgenommen werden soll. »USERNAME« und »PASSWORT« entsprechen den Zugangsdaten zum Account auf diesem Mailserver. Weiterhin können noch optionen angegeben werden, beispielsweise »ssl«.
Je nach Anleitung und persönlichem Geschmack wird der Aufruf mal in einer Zeile geschrieben, mal in Blöcken oder auch jeder einzelne Punkt in einer Zeile. fetchmail arbeitet alle »Schreibweisen« gleich ab, es ist eher als »Freiheit des Administrators« zu sehen wie die Aufrufe geschrieben werden. Dies sei am Rande erwähnt, da die diversen Anleitungen für fetchmail häufig unterschiedlichste Schreibweisen verwenden.
Wenn fetchmail als Daemon im Hintergrund ausgeführt werden soll, unterscheidet sich die Konfiguration ein wenig. Ich gehe weiter unten auf dieser Seite darauf ein.
Wenn alle Einträge vorgenommen wurden, müssen noch die Zugriffsrechte der Datei geändert werden. Ansonsten quittiert fetchmail den Versuch gestartet zu werden mit einer Fehlermeldung:
Datei /home/amy/.fetchmailrc darf nicht mehr Zugriffrechte haben als -rwx--x-- (0710).
Die entsprechenden Rechte sind schnell gesetzt:
chmod 710 ~/.fetchmailrc
Theoretisch könne bereits jetzt ein Testaufruf erfolgen. Jedoch sollte zunächst auch ein Blick auf die Konfiguration von procmail geworfen werden.
Bei procmail werden zwei Konfigurationsdateien berücksichtigt. Zunächst die globale Konfigurationsdatei /etc/procmailrc, weiterhin die jeweilige ~/.procmailrc in den Verzeichnissen der Benutzer.
Die globale Konfigurationsdatei kann wie folgt übernommen werden:
# file: /etc/procmailrc
# system-wide settings for procmail
SHELL="/bin/bash"
SENDMAIL="/usr/sbin/sendmail -oi -t"
LOGFILE="/var/log/procmail.log"
DEFAULT="$HOME/Maildir/"
MAILDIR="$HOME/Maildir/"
Manche Anleitungen setzen bereits in diese globale Konfigurationdatei die Zustellung der einzelnen Benutzer.
Wie schon bei fetchmail liegt bei mir die Konfigurationsdatei für procmail im Benutzerverzeichnis und ist nicht mit der globalen Konfigurationsdatei »vermischt«. Die Datei ~/.procmailrc kann beispielsweise wie folgt aussehen:
DEFAULT="$HOME/Maildir/"
MAILDIR="$HOME/Maildir/" # Dieses Verzeichnis muss als Maildir existieren
LOGFILE="$HOME/.procmaillog" # Ort der Protokolldatei für procmail
#DELIVER="/usr/lib/dovecot/deliver" # Auskommentierte Definition für deliver (obsolet)
LOGABSTRACT=no
VERBOSE=off
:0 # Alles was an *gaskutsche.de geschickt wird, landet
* ^TO.*gaskutsche.de # in ~/Maildir/.gaskutsche/ (ebenfalls ein Maildir)
.gaskutsche/
:0 # Alles was von *@ebay.de geschickt wurde, landet
* ^From.*@ebay.de # in ~/Maildir/.gaskutsche/ (ebenfalls ein Maildir)
.ebay/
procmail ist so konfiguriert, dass alle eingehenden E-Mails mit den beiden Regeln überprüft werden. Wird die E-Mail an »irgendwas«gaskutsche.de geschickt, so wird sie in das entsprechende Verzeichnis verschoben und landet nicht im globalen Posteingang. Gleiches trifft auf E-Mails zu, welche »irgendwas«@ebay.de als Absender haben. Diese werden in den angegebenen Ordner verschoben.
Da sonst keine weiteren Definitionen vorhanden sind, landen alle übrigen Mails im globalen Posteingang.
Diese beiden Beispiele für Mailfilterung sollen nur einen kleinen Eindruck vermitteln, was procmail außer der Zustellung in den globalen Posteingang vermag. Filterung nach Spam, Viren sowie umfangreichere Sortierung von eingehenden Mails sind durch den großen Funktionsumfang realisierbar.
Wichtig ist, dass die jeweiligen Verzeichnisse bereits bestehen, ansonsten gibt es ein Problem bei der Zustellung. procmail legt keine Verzeichnisse an wenn sie nicht existieren sollten. E-Mails werden in diesem Fall nicht zugestellt.
Ich verwende für meinen Posteingang das sogenannte Maildir-Format. E-Mails werden in einem Verzeichnis als einzelne Dateien abgelegt. Alternativ könnte auch das Mbox-Format verwendet werden. Dort werden E-Mails in einer großen Datei zusammengefasst.
Um ein Verzeichnis für die Zustellung im Maildir-Format zu erstellen ist folgender Aufruf notwendig:
maildirmake ~/Maildir/.ebay/
Sollte maildirmake noch nicht auf dem System installiert sein muss es noch installiert werden. maildirmake ist in unterschiedlichen Paketen vorhanden. Ich habe es aus dem Paket von maildrop verwendet:
sudo apt-get install maildrop
fetchmail und procmail sind konfiguriert, nun kann der erste Test mittels einem Aufruf erfolgen:
fetchmail -kv -m "/usr/bin/procmail -d %T"
Dies ist der oben bereits genannte Aufruf bei welchem heruntergeladene E-Mails auf dem Server belassen werden. Sollte etwas bei der Konfiguration von fetchmail und/oder procmail nicht passen, gehen so keine E-Mails verloren.
Wenn alles funktioniert wäre es natürlich vorteilhaft, wenn die E-Mails automatisch alle fünf Minuten abgefragt werden. Man möchte ja nicht wie früher im Mailclient auf den »E-Mails abrufen«-Knopf drücken beziehungsweise die Zeile wieder und wieder eingeben. Um dies zu bewerkstelligen kommen zwei Wege in Frage: entweder man lässt fetchmail als Daemon laufen oder man greift auf cron zurück.
In der Konfigurationsdatei /etc/default/fetchmail wird angegeben ob fetchmail im Hintergrund als Daemon laufen soll oder nicht. Standardmäßig ist fetchmail so eingerichtet, dass es nicht im Hintergrund läuft. Um dies zu ändern muss folgende Zeile entsprechend auf den Wert yes gesetzt werden:
# Declare here if we want to start fetchmail. 'yes' or 'no'
START_DAEMON=yes
Die weiteren Angaben welche Server von fetchmail abgefragt werden sollen und in welchem Intervall dies geschehen soll wird in der Datei /etc/fetchmailrc angegeben:
# /etc/fetchmailrc for system-wide daemon mode
# This file must be chmod 0600, owner fetchmail
set daemon 300 # alle 5 Minutes Mails abrufen
set syslog # log über syslog
set postmaster root # postmaster auf root setzen
Neben den allgemeinen Angaben muss jener Bereich, welchen ich weiter oben in der Anleitung in die ~/home/.fetchmailrc geschrieben habe, in die /etc/fetchmailrc übernommen werden. Dabei müssen jedoch die Aufrufe um den Zusatz is USERNAME here ergänzt werden. Ansonsten kann fetchmail die abgerufenen E-Mails keinem anderen Benutzer korrekt zuweisen.
Der oben bereits erklärte Aufruf, diesmal in mehreren Zeilen umbrochen, würde dann wie folgt aussehen:
poll SERVER
with protocol POP3
user "USERNAME" there
with password "PASSWORD"
is USERNAME here
options ssl
Nachdem die Konfiguration soweit fertiggestellt wurde müssen noch die Schreibrechte angepasst und die Konfigurationsdatei dem Benutzer fetchmail gehören:
chmod 600 /etc/fetchmailrc
chown fetchmail /etc/fetchmailrc
Anschließend kann fetchmail gestartet werden. Das Programm wird nun im Hintergrund als Daemon laufen.
/etc/init.d/fetchmail start
Die Datei /etc/crontab beinhaltet Befehle, welche zu bestimmten Zeitpunkten von cron automatisch ausgeführt werden sollen. Ein Eintrag für das Abrufen der E-Mails alle fünf Minuten würde dafür sorgen, dass der Mailserver stets relativ aktuell ist.
Mein Beispiel ruft eine Datei auf, in welcher der Aufruf von fetchmail zuvor gespeichert wurde. In ~/.fetchmail-aufruf befindet sich der oben bereits genannte Aufruf (welcher die E-Mails nach dem Herunterladen vom Server dort löscht):
fetchmail -v -m "/usr/bin/procmail -d %T"
Die Datei muss natürlich ausführbar sein, also die entsprechenden Rechte besitzen.
In /etc/crontab befindet sich demnach nur noch der Aufruf zu dieser ausführbaren Datei:
# m h dom mon dow user command
0-59/5 * * * * USERNAME /home/USERNAME/.fetchmail-aufruf > /dev/null 2>&1
Natürlich werden in /etc/crontab bereits einige andere Zeilen stehen. Damit es verständlicher wird, sind die Spalten benannt.
Die erste Position gibt die Minuten an wann der Aufruf erfolgen soll. Die Angabe 0-59/5 besagt, dass alle fünf Minuten der Aufruf erfolgen soll.
Die folgenden Positionen (Stunde, Tag, Monat und Wochentag) sind mit einem * versehen. Dies hat zur Folge, dass der Befehl unabhängig von diesen Werten ausgeführt wird. Somit ist einzig und allein die Bedingung »alle fünf Minuten« ausschlaggebend.
Der Aufruf soll nicht als root stattfinden, sondern als jener Benutzer, welcher die E-Mails auch zugestellt bekommt.
In diesem Beispiel sind somit »USERNAME« bei Aufruf und im Pfad zur ausführbaren Datei identisch.
Damit cron nicht alle fünf Minuten eine E-Mail abschickt das der Aufruf erfolgreich war, muss noch die Weiterleitung > /dev/null 2>&1 hinzugefügt werden. Diese bewirkt, dass Ausgaben des Aufrufs in das »Datennirvana« nach /dev/null umgeleitet werden.
Das war es nun auch schon. Das Abrufen von E-Mails ist mittels fetchmail und procmail geregelt und wird dank dem Eintrag in /etc/crontab alle fünf Minuten vollzogen. Über den bereits eingerichteten IMAP-Server dovecot können die E-Mails nun mit einem beliebigen IMAP-fähigen Client abgerufen werden.
dovecot
wiki.ubuntuusers.de/dovecot – ausführliche deutschsprachige Installationsanleitung für dovecot.
www.webmonkey.com/2010/02/set_up_a_debian_or_ubuntu_machine_as_a_maildrop/ – englischsprachige Installations- und Konfigurationsanleitung für dovecot und fetchmail als lokalen MDA (Mail Delivery Agent) mit IMAP.
fetchmail
www.tuxhausen.de/fetchmail.html – deutschsprachige Anleitung für fetchmail mit einfachen Beispielen für die Konfiguration.
wiki.ubuntuusers.de/Fetchmail – deutschsprachige Anleitung für fetchmail, welche etwas mehr in die Tiefe geht und auch auch eine GUI zur Konfiguration behandelt.
www.howtoforge.de/howto/linux/abrufen-von-e-mails-auf-entfernten-servern-mit-fetchmail-debian-etch – deutschsprachige Anleitung wie fetchmail entweder als Daemon oder über cron E-Mails abrufen kann.
www.webmonkey.com/2010/02/set_up_a_debian_or_ubuntu_machine_as_a_maildrop/ – englischsprachige Installations- und Konfigurationsanleitung für dovecot und fetchmail als lokalen MDA (Mail Delivery Agent) mit IMAP.
procmail
wiki.ubuntuusers.de/mutt – Informationen zum textbasierten MUA mutt mit einem kurzen Teilbereich über procmail.
wiki.dovecot.org/procmail – Grundlegende Konfiguration von procmail über die Datei /etc/procmailrc.
www.freebsd.org/doc/de/books/handbook/mail-procmail.html – deutschsprachige Anleitung welche sich mit dem Filtern von E-Mails mittels procmail auseinandersetzt.
www.uibk.ac.at/zid/systeme/mail/procmail/extend_procmail.html – umfangreiche englischsprachige Anleitung mit vielen Beispielen zur Filterung mittels procmail.
crontab
wiki.ubuntuusers.de/cron – umfangreiche deutschsprachige Anleitung mit vielen Beispielen wie cron beziehungsweise /etc/crontab für die regelmäßige Ausführung von Programmen und Skripten verwendet werden kann.
X_FISH