SOHO Mailserver unter Debian Lenny mit Getmail
Hier geht's um die Idee, einen schicken, lokalen SOHO Mailserver unter Debian Lenny einzurichten. SOHO bedeutet Small Office, Home Office - wir reden hier also vom klassischen Serverlein daheim im Schrank, bis hin zum ausgewachsenem Server mit einigen (wenigen) Clients. Das ist kein Copy/Paste-Tutorial. Vielmehr geht es hier um die Möglichkeiten von Debian, einen solchen Mailserver zu realisieren.
Wozu überhaupt ein lokaler Mailserver?
E-Mails direkt am Client per POP abzuholen hat einige Nachteile. Besonders dann, wenn man von verschiedenen Rechner auf seine E-Mails zugreifen will. Außerdem ist die Datensicherung, auch bei nur einem Client, echt anstrengend.Deswegen wurde IMAP erfunden! Mich stört aber:
- Die Daten liegen irgendwo (im schlimmsten Fall bei Google!).
- Begrenzter Speicherplatz: schon allein die Tatsache, dass eine Grenze existiert, stört.
- Lag! Egal ob xxMbit und lokaler Cache: inet < LAN
Ein lokaler Mailserver löst all diese Probleme: E-Mails werden von diversen Konten per POP3 beim jeweiligen Provider abgeholt, und dann per IMAP im lokalen Netz zur Verfügung gestellt.
Die Anforderungen
- Abholung von E-Mails verschiedener POP3-Konten bei verschiedenen Providern (GMX, 1und1, usw.)
- Serverseitige (Spam-)Filter und Weiterleitungen
- Bereitstellung der Mails mehrerer externer POP-Konten in einem IMAP-Postfach (in Unterordnern)
- Versand über den SMTP-Server des jeweiligen Providers
- Internen Mailversand direkt zustellen
- Shared IMAP Ordner
Die Installation
Glücklicherweise sind alle benötigten Tools als Debian-Pakete verfügbar. Als MTA verwenden wir Postfix, IMAP-Postfächer werden von Dovecot bereitgestellt. Sieve filtert die E-Mails serverseitig. Getmail holt E-Mails von POP3-Konten und Spamassassin kümmert sich um den SPAM. Als Bonus gibt's den Webmailer Squirrelmail mit Avelsieve, zum Erstellen/Bearbeiten von Sieve-Regeln per Browser.Benutzer
Die verschiedenen Mail-Benutzer sind "normale" Shell-Benutzer. Die Mail-Verzeichnisse sind jeweils im Home-Verzeichnis des Users. Wir entscheiden uns mal für ~/mail. Das Format ist Maildir und die Verzeichnisse cur, tmp und new müssen wir von Hand mit maildirmake unterhalb von ~/mail anlegen oder einmalig in /etc/skel.Postfix
Eigentlich könnte man die Mails auch direkt vom Client aus wegschicken. Der "Umweg" über den lokalen Mailserver hat aber den Vorteil, dass wir interne Mails direkt zustellen können (dazu später mehr). Außerdem finde ich es schicker, die SMTP-Daten einmalig am Server zu konfigurieren und dann am Client die einfachen Shell-Logindaten einzutippen. Für serverseitige Weiterleitungen (mit Sieve) brauchen wir sowieso einen MTA.apt-get install postfix postfix-tls
Wir wählen Internetbetrieb mit Smarthost. Wir wollen ausgehende Mails über den jeweiligen SMTP-Server des Mail-Anbieters senden (also alles von me@gmx.net über smtp.gmx.net, alles von you@1und1.de über smtp.1und1.de usw.). Deshalb müssen wir Postfix so konfigurieren, dass es je nach Absenderadresse verschiedene SMTP-Server mit Authentifizierung verwendet. Das geht mit sender_dependent_relayhost_maps:
/etc/postfix/main.cf:
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay smtp_tls_auth_enable = yes smtp_tls_password_maps = hash:/etc/postfix/tls_passwd
/etc/postfix/sender_relay:
me@gmx.net [smtp.gmx.net] you@1und1.de [smtp.1und1.de] ...
/etc/postfix/tls_passwd:
me@gmx.net Benutzer:Passwort you@1und1.de you:geheim
Dovecot
Wir installieren Dovecot 1.2 aus den Lenny-Backports. Warum wir die Backports-Version von Dovecot nehmen, und wie man die Backports zur sources.list hinzufügt, habe ich in einem früheren Beitrag schon einmal erwähnt.apt-get install -t lenny-backports dovecot-common dovecot-imapd
Getmail4 /Spamassassin
apt-get install getmail4 spamassassin
Jeder Benutzer hat pro Account eine getmailrc_*-Datei in ~/home/.getmail/. Ein Cronjob führt Getmail regelmäßig aus. Ein Lockfile sorgt dafür, dass E-Mails nicht doppelt abgeholt werden, wenn ein von Cron angestoßener Getmail-Prozess einmal länger dauert.
~$ vi ~/.getmail/getmailrc_me_gmx.net [options] delete = true [retriever] type = SimplePOP3Retriever server = pop.gmx.net port = 110 username = me@gmx.net password = geheim use_apop = false timeout = 180 delete_dup_msgids = false [destination] type = MDA_external path = /usr/sbin/sendmail arguments = ('-f', 'me@gmx.net', '-oi', 'Shell-Login-Name@Lokaler-Host') [filter] type = Filter_external path = /usr/bin/spamc arguments = ("-s", "250000", "-u", "Shell-Login-Name", "-p", "783", )
An Postfix wird einmal die lokale Adresse (Shell-User@Hostname) und die externe E-Mail-Adresse übergeben. Das erlaubt die spätere Einsortierung in IMAP-Unterordner anhand des POP-Kontos mittels Envelope-From-Header.
Die Spamassassin-Filterung muss direkt von Getmail über [Filter] konfiguriert werden. Die Weiterleitung an Postfix erfolgt nämlich NICHT per SMTP, und somit ist der Spamassassin in Postfix nutzlos.
Der Cronjob
Der Cronjob wird von root ausgeführt und sucht in Home-Verzeichnissen nach getmailrc_*-Dateien. In diesem Beispiel macht er das jede Minute.~$ sudo crontab -u root -e */1 * * * * /usr/local/bin/getthemail.sh >/dev/null 2>&1 ~$ sudo vi /usr/local/bin/getthemail.sh #!/bin/sh LOCK_FILE="/var/lock/getthemail" if [ ! -f "${LOCK_FILE}".lock ]; then lockfile-create "${LOCK_FILE}" lockfile-touch "${LOCK_FILE}" & for getfile in $( find /home/\*/.getmail/ -name getmailrc\\\* -print ) do Y=`ls -l $getfile | awk '{print $3; }'` touch $getfile sudo -u $Y /usr/bin/getmail --getmaildir /home/$Y/.getmail/ --rcfile $getfile done lockfile-remove "${LOCK_FILE}" fi exit 0;
Sieve-Filterung
Dovecot 1.2 kommt mit eigener Sieve-Implementierung. Ganz fix:~$ sudo apt-get install squirrelmail avelsieve ~$ sudo vi /etc/dovecot/dovecot.conf protocols = imap pop3 pop3s imaps managesieve protocol lda { [...] mail_plugins = sieve }
Per Sieve können wir jetzt auch E-Mails von verschiedenen POP3-Accounts in einem IMAP-Account organisieren. Getmail kann Mails verschiedener Konten in einem IMAP-Ordner zur Verfügung stellen. Mit einer Sieve-Regel lassen sich diese E-Mails in verschiedene Ordner schieben. Der Envelope-To-Header entspricht dabei immer der ursprünglichen Ziel-Adresse.
Interne Mails
Da alle ausgehenden Mails über den Postfix laufen ist das ein Klacks! Wir "mappen" externe Adressen auf lokale User-Accounts. Das ganze passiert mit Hilfe von alias_maps~$ postconf -e alias_maps = hash:/etc/postfix/local_delivery ~$ sudo vi /etc/postfix/local_delivery test@gmx.net test
Wobei "test" ein lokaler Shell-Benutzer wäre.
Shared IMAP Ordner
Auch hier bietet Dovecot verschiedene Möglichkeiten. Die einfachste: wir symlinken das Shared-Folder einfach in das jeweilige IMAP-Root-Verzeichnis:ln -s /home/share/mail /home/user/.Shared
In diesem Fall sharen wir die INBOX des users "share". Das funktioniert natürlich auch für Unterverzeichnisse. Wichtig ist nur, dass dann der user "user" Schreibrechte auf cur, tmp, new und auf die Dovecot-Index-Dateien des "share"-Benutzers besitzt.