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.


 
 
 

6 Kommentare zu “SOHO Mailserver unter Debian Lenny mit Getmail”

  1. Julian Wolter
    24. August 2010 um 14:37

    Hallo,
    super Tutorial, hat mir sehr weiter geholfen und auch prima funktioniert!!!

    Also, vielen Dank dafür, dass ich nun endlich meinen ersten, zwar nur lokalen, Mail-Server einrichten konnte ;)

  2. bjoern
    24. Januar 2011 um 01:19

    moin,

    hab ja schon vieles versucht, mal einen imap server mit dovecot auf meiner nslu2 mit debian lenny zum Laufen zu bekommen, aber es will einfach nicht..hab es eigentlich auch nach Deiner Anleitung hier probiert. Bin allerdings auch auf einige Hürden gestoßen..:
    z.B.:
    warum steht in der ~/.getmail/getmailrc_me_gmx.net was von sendmail??? wurde doch garnicht installiert???!

    Dann steht in der /usr/local/bin/getthemail.sh was von sudo?? muss ich das über apt-get nachinstallieren oder was bedeutet das..

    anbei mal eine Meldung, wenn der server versucht das script “getthemail.sh” auszuführen:

    ba-vmdebian01:/usr/local/bin# ./getthemail.sh
    Configuration error: configuration file /home/bjoern/.getmail/getmailrc_mrgoofy911 incorrect (arguments: incorrect format (invalid syntax (, line 1)))

    würde mich über Hilfe freuen.
    Danke
    Grüße Björn

  3. neunzehn83
    24. Januar 2011 um 18:03

    /usr/sbin/sendmail kommt von postfix und ist eine sendmail kompatible binary
    “sudo -u $Y” habe ich dazu benutzt, um den getmail-Prozess unter dem jeweiligen User der Mailadresse auszuführen. Kann man denke ich auch weglassen und getmail direkt als root ausführen.

    Ansonsten stimmt wohl was mit deiner getmailrc_-File nicht. In Zeile 1 sollte eigentlich nur “[options]” stehen…

  4. bjoern
    30. Januar 2011 um 13:22

    MOin Moin,

    danke nochmal fuer die schnelle hilfe. Aber leider besteht das Problem noch und ich finde es nicht.
    Habe unter VMWare ein frisches Debiansystem Lenny aufgesetzt, funktioniert auch alles, habe dann nach diesem Howto hier alles gemacht, auch Dovecot 1.2 von backports installiert, funktionierte auch alles soweit..

    nur wenn ich versuch das getthemail.sh script auszuführen kommt immer dieser fehler:
    ————————————————-
    ba-mail01:/usr/local/bin# ./getthemail.sh
    Configuration error: configuration file /home/bjoern/.getmail/getmailrc_mrgoofy911_gmx.net incorrect (arguments: incorrect format (invalid syntax (, line 1)))
    ba-mail01:/usr/local/bin#

    der Inhalt der datei sieht so aus:
    ————————————————-
    ba-mail01:/usr/local/bin# cat 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
    /usr/bin/getmail –getmaildir /home/$Y/.getmail/ –rcfile $getfile
    done
    lockfile-remove “${LOCK_FILE}”
    fi
    exit 0;

    Der Inhalt der getmailrc_xx_gmx.net sieht so aus:
    ————————————————–
    ba-mail01:/home/bjoern/.getmail# cat getmailrc_xx_gmx.net
    [options]
    delete = false

    [retriever]
    type = SimplePOP3Retriever
    server = pop.gmx.net
    port = 110
    username = xx@gmx.net
    password = xx
    use_apop = false
    timeout = 180
    delete_dup_msgids = false

    [destination]
    type = MDA_external
    path = /usr/sbin/sendmail
    arguments = (‘-f’, xx@gmx.net.de‘, ‘-oi’, ‘bjoern@ba-mail01)

    [filter]
    type = Filter_external
    path = /usr/bin/spamc
    arguments = (“-s”, “250000″, “-u”, “bjoern”, “-p”, “783″, )

    also alles so, wie beschrieben, bekomme bei der installation auch keine fehler, nur wenn ich versuche, mit getmail die mails abzuholen..

    noch ein Hinweis:
    dovecot muss mit “dovecot-imapd” installiert werden, “dovecot-imap” gibt es nicht..

    hoffe kannst mir dabei helfen, verzweifel hier so langsam..
    Danke und Gruß

  5. Alda
    2. Februar 2011 um 18:37

    Hallo Björn,

    in der Zeile arguments bei [filter] fehlt ein Hochkomma

  6. neunzehn83
    2. Februar 2011 um 19:09

    Ich denke es fehlt bei [destination] arguments. Zwei mal. Die haben auch im Post gefehlt. Wurde korrigiert!

Kommentar abgeben: