Howto: Fetchmail, Postfix, Procmail, Dovecot auf der SLUG

Vor einigen Wochen hat mich es mal wieder extrem angekotzt, dass bei meinen verschiedenen Mailkonten Probleme auftraten. Web.de lässt sich nur alle 15 Minuten abfragen, AOL bringt KMail ständig zum Absturz, usw. Außerdem wäre eine automatische Verteilung und Filterung schön, da im Moment alles quer durcheinander auf meinen Konten eingeht. Die Filtermöglichkeiten von KMail gefallen mir nicht wirklich…

Als Lösung habe ich auserkoren, meine SLUG als Mailserver einzurichten, um alle Mails dort zu sammeln und im Netzwerk bereit zu stellen. Versand über die SLUG sollte auch möglich sein.

Der erste Schritt war nun, sich in die Mailserver-Konfiguration unter Linux einzulesen. Hier habe ich schnell gemerkt, dass dies bei weitem nicht trivial ist (für nen Nicht-Admin ;)). Zu verstehen, wie die verschiedene Programme eines Mailservers funktionieren hat einige Zeitgedauert, die Einrichtung noch länger. Ich fange also mal ganz von vorn an:

Mail Retrieval Agent: Fetchmail

Dieses Program sorgt dafür, dass Emails von einem entferntem Server abgeholt werden können. Diese gibt es an das lokale Linux-Mailsystem oder den Mail Delivery Agent weiter. Mehr tut es nicht. Als Programm habe ich Fetchmail gewählt, da es in vielen Howtos sehr gut beschrieben wird. Für Fetchmail muss man eine Config-Datei namens .fetchmailrc im Home-Verzeichnis anlegen. Meine Config sieht folgendermaßen aus:


# ~/.fetchmailrc
set postmaster<username>
set bouncemail

# Spam account, dont let messages on the server, fetch old and new messages, use SSL
poll pop3.web.de
protocol POP3
port 995
user „XXXXXXX@web.de“ there     #  username on mailserver
with password „XXXXXXX“             # password on mailserver
is XXXXXXX here                               #  local user name
fetchall
ssl
nokeep
mda ‚procmail -fv‘                                  # execute procmail
mda „/usr/bin/procmail -d %s“          # execute procmail

# regular account, leave messages on server, fetch only new messages
poll pop.aim.com
protocol POP3
user „XXXXXXX“ there
with password „XXXXXXX“
is XXXXXXX here
keep
nofetchall
mda ‚procmail -fv‘
mda „/usr/bin/procmail -d %s“

# regular account, leave messages on server, fetch only new messages, use SSL
poll pop3.t-online.de
protocol POP3
port 995
user „XXXXXXX“ there
with password „XXXXXXX“
is XXXXXXX here
keep
ssl
nofetchall
mda ‚procmail -fv‘
mda „/usr/bin/procmail -d %s“

Hier werden von beispielsweise drei Konten Mails abgeholt und an Procmail weitergegeben (siehe nächstes Kapitel). Ein Konto ist mein Spamkonto für Foren, Shopping und Mailing-Lists. Es kann deshalb sehr schnell voll laufen, weshalb hier alle Mails beim Abholen vom Server gelöscht werden. Die beiden anderen Konten lassen zwecks Redundanz die Mails auf dem Server. Die Kommentare geben an, was das Kommando tut bzw. was in XXXXXXX stehen soll.

Mail Delivery Agent: Procmail (optional)

Dieser Schritt ist optional. Mittels Procmail können Mails gefiltert und an IMAP-Ordner verteilt werden. Auch Spamfiltering mittels Spamassassin ist möglich, dies möchte ich meiner SLUG aber nicht antun. Für mich reicht es hingegen, einkommende Mails in verschiedene IMAP-Ordner zu filtern, was mit einfachen regulären Ausdrücken geht. Im Homeverzeichnis muss dazu eine Datei mit Namen .procmailrc angelegt werden. Meine sieht folgendermaßen aus:


# ~/.procmailrc
PATH="/usr/bin:/usr/local/bin"
MAILDIR="$HOME/mails"
DEFAULT="$HOME/mails/<username>"
LOGFILE="$HOME/mails/procmail.log"
SHELL="/bin/sh"
VERBOSE="on"

#########################################################
##### Filter Mailing Lists like BlueCove, OpenMoko
:0:
* ^To:.*bluecove-users@googlegroups\.com
.MailingLists.BlueCove/

:0:
* ^From:.*skarzhevskyy@gmail\.com
.MailingLists.BlueCove/

:0:
* ^Subject:.*\[BlueCove-users\]
.MailingLists.BlueCove/

:0:
* ^CC:.+@lists\.openmoko\.org
.MailingLists.OpenMoko/

:0:
* ^To:.+@lists\.openmoko\.org
.MailingLists.OpenMoko/

##########################################################
##### Filter Online-Shopping like eBay, Amazon: use From field
:0:
* ^From:.*[Aa]mazon.*
* ^From:.*eBay.*
.Filter.Shopping/

###########################################################
##### Filter by Accout: use the To field

:0:
* ^To:.*XXXXXXXXXXXXXXX\.de
.Kontos.T-Online/

:0:
* ^To:.*XXXXXXXXXXXXXXX\.de
.Kontos.Webde/

:0:
* ^To:.*XXXXXXXXXXXXXXX
.Kontos.AOL/

#############################################################
######### Filter all others to INBOX
:0:
./

Hier werden eingehende Mails erst nach Absendern, Mailinglisten, Shops, etc gefiltert und danach je nach Empfänger auf die verschiedenen Ordner auf dem IMAP-Server. Die Punkte und Slashes sind hier sehr wichtig!!! Trennzeichen für IMAP-Ordnerstrukturen ist der Punkt. An jedem IMAP-Ordnereintrag muss unbeding der Slash angehängt werden. XXXXXXX steht hier wieder für den jeweiligen Empfänger.

IMAP-Server: Dovecot

Um es gleich vorweg zu sagen, Dovecot steht nicht für die Exkremente irgendwelcher Zugvögel, sondern für Taubenschlag. Dovecot ist ein performanter und schlanker IMAP-Server und deshalb sehr geeignet für die SLUG. Dovecot lässt sich sehr einfach mit dem Befehl aptitude install dovecot-common dovecot-imapd installieren. Danach muss evtl. noch die Konfigurationsdatei /etc/dovecot/dovecot.conf angepasst werden. Meine enthält folgendes.


# /etc/dovecot/dovecot.conf
protocols = imap # only IMAP
disable_plaintext_auth = no # insecure
ssl_disable = yes # insecure
mail_location = maildir:%h/mails # mail is at mails-dir in home folder
mail_privileged_group = mail
protocol imap {
}
auth default { # authentication on local users
mechanisms = plain
passdb shadow {
}
userdb passwd {
}
user = root
}

Die vorliegende simple Config stellt Dovecot so ein, dass es nur über IMAP erreichbar ist. Die unsicheren Einstellungen für Plaintext Authentication und SSL sind für mein lokales Netzwerk ausreichend, keinesfalls, wenn der Server im Internet sichtbar sein soll. Für Nutzernamen und Passwörter werden die der lokalen User verwendet.

Mail Transfer Agents (nicht notwendig):

Während der Einrichtung des Mailservers bin ich des Öfteren auf Mail Transfer Agents gestoßen. Diese Programme haben den Zweck, vom Mail Retrieval Agent Mails zu erhalten und an die lokalen Unix-Mailkonten zu verteilen. Zusätzlich übernehmen sie den Mailversand über SMTP entweder an lokale Nutzer oder an andere SMTP-Server. Für meine Konfiguration sind diese jedoch nicht notwendig, da Mails automatisch von Procmail verteilt werden und der Versand weiterhin vom Email-Client aus läuft. Grundsätzlich würde der Versand über den lokalen MTA auch funktionieren. Diese würde dann die gesendeten Emails an einen SMTP-Server weiterleiten, falls der Empfänger nicht lokal existiert. Leider blockt jeder Spam-Filter Mails, deren Absender-Adresse nicht mit der Server-Adresse übereinstimmt.

Cron:

Der Cron-Demon ist ein Linux-Programm zur zeitgesteuerten Ausführung von Programmen. Um die Systemlast auf der SLUG gering zu halten, verwende ich den Cron-Demon um in regelmäßigen Abständen Fetchmail auszuführen. Dazu muss eine Crontab erstellt werden, eine Tabelle der auszuführenden Tasks. Die Crontab wird für einen einzelnen Nutzer mittels crontab -e erstellt. Meine sieht folgendermaßen aus:

# crontab, created by "crontab -e" command
# m h dom mon dow command
00 * * * * /usr/bin/getmails --force &> /dev/null
@reboot /usr/bin/getmails --force &> /dev/null

Die erste Zeile lässt jede Stunde das von mir geschriebene Skript getmails laufen (siehe nächstes Kapitel). Die zweite Zeile tut das gleich, jedoch sofort beim Start des Demons. Alle Mails werden nach /dev/null weiter geleitet 😉 Ne, natürlich nicht, sondern nur die Standard- und Fehler-Ausgabe. Fehlt die Ausgabeumleitung, so erhält man bei jedem Lauf des Skripts eine Email mit der Ausgabe.

Getmails:

Das von mir geschriebene Bash-Skript /usr/bin/getmails erweitert die Funktionalität von Fetchmail noch ein bisschen. Es erfüllt folgende Aufgaben:

  • Emails werden nur abgerufen, wenn auch der Nutzer am IMAP-Server angemeldet ist. Gut für häufige Checks, ohne die Festplatte aufzuwecken. Sie läuft nur an, wenn auch wirklich neue Mails geholt werden.
  • Optische Signale mittels Disk-2-LED: Blinken, wenn Skript läuft, langsames Blinken, wenn Mails gefunden, sonst LED aus.
  • Akustische Signale: Beep, wenn Mails gefunden.
  • –force Option zum Check, auch wenn der Nutzer nicht angemeldet ist
  • Ausgaben sollen geloggt werden

Das Skript sieht so aus:

#!/bin/bash
# usage string
USAGE="Usage: getmails.sh [--force]
This script is wrapper for fetchmail. It executes fetchmail only if the executing user is logged on at the IMAP server (dovecot).
If --force parameter is given, check is performed even if user is not connected."

# default led values
RUNNING=flash
MAILFOUND=slow
NOMAILFOUND=off

# set LED
sudo leds disk-2 „$RUNNING“

# set default variables
PARAMS=$#
USERNAME=$(whoami)
FORCE=“false“
LOGFILE=“/home/$USERNAME/mails/lastlog.log“

# check –force parameter
if [ -z „$1″ ]
then
FORCE=“false“
else
if [ „$1“ == „–force“ ]
then
FORCE=“true“
else
echo $USAGE
exit 1
fi
fi

# Check if user is connected to Dovecot
LOGON=$(ps –user „$USERNAME“ | grep „imap“)

# Debug output
echo „Username: $USERNAME“
echo „Force: $FORCE“
echo „Logon: $LOGON“

if [ „$FORCE“ == „true“ ]
then
echo „Force email check for user $USERNAME“
fetchmail &> „$LOGFILE“
STATUS=$?
else
if [ -z „$LOGON“ ]
then
echo „No user logged in, do nothing.“
else
echo „User logged in, checking emails.“
fetchmail &> „$LOGFILE“
STATUS=$?
fi
fi

echo „Status: $STATUS“

if [ „$STATUS“ == „0“ ]
then
sudo leds beep -f 500 -n
sudo leds disk-2 „$MAILFOUND“
else
sudo leds disk-2 „$NOMAILFOUND“
fi

Das Skript sollte nach Erstellung als nur vom Root editierbar gesetzt werden, um Manipulation zu vermeiden.

Fazit:

Meine jetzige Konfiguration funktioniert nach einigen Wochen Einarbeitung schon sehr gut. Das Skript wird jede Stunde ausgeführt, voher hatte ich einen viertelstündigen Check, was aber die externe Festplatte sehr oft aufgeweckt hat. Jetzt wird sie nur 1x pro Stunde aufgeweckt und ich erhalte gleichzeitig eine sofortige Rückmeldung von der SLUG, so dass ich dann die Mails mit meinem Mailprogramm anschauen kann.

Als nächstes werde ich mir noch den Webmailer Squirrelmail zu gemüte führen, um Mails auch ohne Mailprogramm lesen zu können. Auch VPN wäre nicht schlecht, um auch von entfernten Rechnern (Arbeit, Handy, etc.) darauf zuzugreifen.

Advertisements

4 Responses to Howto: Fetchmail, Postfix, Procmail, Dovecot auf der SLUG

  1. jal2 sagt:

    Hi,

    wozu benötigst Du postfix? Ich stehe vor derselben Frage, wie ich einen zentralen Mailserver im Hausnetz einrichten will.
    Fetchmail/procmail/dovecot für den Empfang. Ich hätte nur auch gern einen zentralen Sent-Ordner mit Kopien aller gesendeten Emails, ohne mich jedesmal auf cc: setzen zu müssen.

    /Jörg

  2. Erics Blog sagt:

    Howto: Debian Mailserver bestehend aus Fetchmail, Procmail, Dovecot und Postfix…

    Nachdem mein Debian Server eine Weile zuverlässig lief, habe ich mich entschlossen, auch einen Mailserver hinzuzufügen. Nach kurzer Zeit wurde mir allerdings klar, dass dies nicht so einfach werden und ich einige Zeit benötigen würde, um diesen fehlerf…

  3. Markus sagt:

    Hi, erstmal danke für das HowTo, es hat mir die Mailserver-Sache sehr erleichtert.
    Dennoch hast Du da noch einen kleinen Fehler im procmailrc-Script.

    :0:
    * ^From:.*[Aa]mazon.*
    * ^From:.*eBay.*
    .Filter.Shopping/

    Die beiden conditions werden mit UND verknüpft das heißt, es wird nie eine Mail im Shopping-Ordner landen.
    Korrekt wäre:

    :0:
    * ^From:.*([Aa]mazon|eBay).*
    .Filter.Shopping/

    Gruß Markus

  4. Howdy! I could have sworn I’ve visited this site before but after looking at a few of the articles I realized it’s new to me.
    Anyways, I’m certainly pleased I stumbled upon it and I’ll be book-marking
    it and checking back frequently!

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: