Lokaler Mailserver mit fetchmail, procmail und Cyrus

by Michi on März 10, 2007

Da ich jetzt schon von mehreren Leuten gefragt wurde, wie ich hier Zuhause meinen (sehr gut funktionierenden) E-Mail Server aufgesetzt habe, möchte ich das mal in meinem Blog als kleines How-to beschreiben.

Ich setzte auf meinem Server Ubuntu in der Version 6.06 ein. Das How-to ist also darauf angepasst. Wer aber ein wenig Ahnung von Linux im Allgemeinen hat, wird diese Methode ohne Probleme auch auf jede andere Distri portiert bekommen.

Wunschvorstellung

Zunächst mal unser globales Ziel, dass wir mit dem lokalen Server erreichen möchten: Mit der Zeit sammeln sich einige verschiedenste E-Mail Postfächer an, die man entweder per POP3 oder IMAP abfragt und in seinem Client verwaltet. Wir wollen nun, dass unser Server alle E-Mail Konten in einem regelmäßigen Zeitraum abfragt (zB 5 Min.), herunterläd, auf Viren und Spam prüft und dann in einem zentralen Konto sammelt. Wir wollen dann mit unserem Client per IMAP diese eine Konto abfragen, in dem die Mails bereits nach Spam gefiltert, virengescannt und vorsortiert auf uns warten. Dieses IMAP Konto können wir dann natürlich mittels DynDNS von überall auf der Welt abfragen. Entweder direkt über unseren Client auf dem Laptop oder auch Webmaillösungen wie Squirrelmail oder RoundCube.

Abgrenzungen

Ich werde in diesem Artikel nur auf das empfangen und sortieren der Mails eingehen. Versenden von E-Mails über den eigenen Server kommt, wenn es sich um einen lokalen Server im Keller handelt, selten in Frage, da kaum ein seriöser ISP E-Mails von dynamischen IP-Adressen annimmt. Freemailer schon gar nicht. Zum Versenden von Mails greifen wir also auf den alt hergebrachten SMTP unseres ISP zu.

Voraussetzunegn und Programme

Wir werden für unsere Wunschvorstellung die folgenden Programme verwenden

  • fetchmail zum Sammeln der E-Mails aller Konten
  • procmail zum sortieren der Mails und weitergabe an den Spamfilter
  • spamassassin als den ultimativen Spamfilter
  • ClamAV zum Filtern nach Viren
  • Cyrus als IMAP Server zum Abrufen der Mails

Auf gehts

Endlich gehts los. Zunächst einmal müssen wir alle Programme samt Abhängigkeiten installieren
sudo apt-get install fetchmail procmail spamassassin cyrus22-imapd cyrus22-admin clamav clamav-freshclam clamav-daemon sasl2-bin Wenn ich mich recht erinnere, sind einige Programme in universe, so zB cyrus22-admin. Diese sollten also entsprechend aktiviert werden.  Achtung: Auf einer Ubuntu 6.10 Version ist der Cyrus-Daemon in der konfiguration, die wir brauchen verbuggt. Man muss dort zuerst einen Patch einspielen und dann die *.debs neu bauen, damit das funktioniert. Wie das geht, ist hier sehr gut zusammengefasst.
Jetzt geht es an die Konfiguration der einzelnen Programme

fetchmail

In der datei .fetchmailrc die wir optimalerweise in unserem Homeverzeichnis oder in /root/ ablegen sieht so aus:
poll "pop3.server.tld" protocol pop3
user "{username}"
pass "{password}"
mda /usr/bin/procmail

Die Konfiguration im Einzelnen: in der ersten Zeile definieren wir den Server und das Protokoll mit dem wir unsere E-Mails abrufen möchten. In der zweiten und dritten Zeile setzen wir Benutzername und Passwort unseres Kontos, das wir abfragen. Die Vierte Zeile bestimmt unseren MDA, der die Mails entgegen nimmt und sortiert. Wir haben uns ja bereits für procmail entschieden und so geben wir den Pfad dort an. Um mehrere Konten abzurufen, muss dieser Block einfach beliebig oft mit den entpsrechenden Daten wiederholt werden.

Spamassassin

Selten hat mich ein Programm so beeindruckt wie Spamassassin! Spamassassin ist ein Perl-basierter Spamfilter des Apache Projekts, der – ich möchte behaupten – hervorragend funktioniert. Ich habe ihn seit gut einem Jahr "im Dienst" und kann eine Trefferquote von 98,42% verbuchen. So genannte "positive false", also Mails die fälschlicherweise als Spam eingestuft wurden, hatte ich in dieser Zeit sagenhafte 3 Stück. Halte ich für sehr gut ;o). Großartig konfiguriert habe ich den Spamassassin dabei nicht. die Datei  /etc/spamassassin/local.cf sieht bei mir wie folgt aus:rewrite_header Subject [SPAM]
required_score 4.0
Die Direktive "rewrite_header Subject" bewirkt, das Mails die als Spam identifiziert wurden, im Subject verändert werden, in dem ein [SPAM] davor geschrieben wird. Das ermöglicht das Clientseitige filtern mittels einer Regel oder ähnlichem. Die Anweisung "required_score 4.0" sagt, dass mindestens 4 "Spampunkte" erreicht werden müssen, damit eine Mail als Spam eingestuft wird. Die 4 ist nach meiner Erfahrung ein sehr guter Wert. Die meisten Spammails, die bei mir eintrudeln liegen zwischen 15 und 30 Punkten.

ClamAV

Normalerweise ist ein Virenscanner auf Linux eine recht unnötige Sache, die eigentlich nur Ressourcen verbraucht. Da wir hier aber höchstwahrscheinlich mit Heterogenen Netzwerken zu tun haben werden (also mit Windows Clients) wird die Sache schon wieder interessant. Konfigurieren lässt sich der Virenscanner durch den Befehl sudo dpkg-reconfigure clamav-base Die Einstellungen bleiben dabei soweit eigene Entscheidung, wichtig wäre nur noch, dass das Mail-Scanning eingeschaltet wird. Alternativ kann man auch in der Datei /etc/clamav/clamd.conf rumdoktern. Nach der Konfiguration sollte der Daemon bereits laufen. Das Startscript liegt dann unter /etc/init.d/clamav-daemon. Für die Automatische Aktualisierung der Virendefinitionen empfehle ich folgenden Befehl "freshclam -d" Dieser schaut regelmäßig nach Definitionsupdates.

Cyrus IMAP-Server

Die einrichtung des Cyrus zusammen mit dem saslauthd ist etwas kompliziertern (vor allem Umfangreicher). Ich erlaube mir daher einfach auf den sehr guten Wiki Artikel von Ubuntuusers zu verweisen, in dem der Schritt "Einrichten von Cyrus" abgearbeitet werden muss. Die Einrichtung von postfix kommt bei uns nicht zum Einsatz, die kann also getrost weggelassen werden.
Nachdem wir ein Benutzerkonto mittels diesen Befehlen hier angelegt habensudo cyradm --user cyrus --server localhost
cm user.karl
Können wir uns schon Tetsweise über unseren E-Mail Client auf den Server verbinden, Ordner anlegen und auch schon E-Mails von anderen Konten hin und her kopieren. Wichtig ist, dass der zu verbindende User auch im Linux System als Benutzer mit Passwort angelegt ist.

Procmail

Procmail übernimmt die Sortierung unserer E-Mails. Diese können wir entweder über eine lokale .procmailrc Datei im Home Verzeichnis des Benutzers machen oder über eine globale /etc/procmailrc. Die Datei sieht bei mir so aus:#Konfiguration der Mailsortierung
#########################################
# Variablen setzen
DELIVER="/usr/sbin/cyrdeliver"
LOGFILE=/var/log/procmail.tiberian
VERBOSE=on
## Diese Regel leitet ALLE empfangenden Mails zusätzlich in die Datei "savemails" weiter. Das ist zum Testen eine gute Sache, da dann keine Mails verloren gehen, Wenn alles funktioniert, diesen Teil unbedingt auskommentieren.
:0 c
savemails
## Die Regel leitet alle Mails, die kleiner als 250kb sind an SPAMASSASSIN weiter
:0fw: spamassassin.lock
* < 256000
| spamassassin
## Alle Mails ab 15 Spampunkten werden in ein separates Verzeichnis sortiert
## Man könnte diese auch direkt löschen.
:0: spamassassin.lock2
* ^X-Spam-Level: \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
| $DELIVER -e -a tiberian -m user.tiberian.Junk
## Schlussendlich alle Mails an tiberians Mailbox übergeben.
:0 w
| $DELIVER -e -a tiberian -m user.tiberian
~
Der Teil $DELIVER -e -a tiberian -m user.tiberian muss natürlich durch den eigenen Benutzer und die eigene Mailbox ersetzt werden.

Erster Testlauf

Jetzt haben wir alle Programme passend konfiguriert, sodass wir einen Testlauf starten können. Wir brauchen nichts weiter tun, als den Fetchmail anzuweisen, unsere E-Mails abzuholen. Alles andere läuft von dann an automatisch. Fetchmail starten wir zum Testen mit diesen Parametern: sudo fetchmail -kv(Alle die jetzt schreien "Hilfe, fetchmail als root? Is doch scheiße!": ich komme später noch darauf zurück). Der Parameter -k steht für Keep. Unsere E-Mails werden also erstmal auf dem POP3 Server belassen und nicht nach dem Abholen gelöscht. -v steht für Verbose, wir sehen also, was genau grade passiert. Wenn alles geklappt hat, landen die E-Mails nach einigen Sekunden im Cyrus IMAP verzeichnis und wir können sie in unserem Client lesen. Wenn nicht, ist irgendwas schiefgelaufen.

Debugging

Alle eingesetzten Programme schreiben logfiles, sodass wir das Problem schnell eingrenzen können. Fehler im Fetchmail sehen wir direkt beim aufruf mit -v. Cyrus schreibt Fehler nach /var/log/mail.err oder /var/log/mail.info. Falls etwas mit der Authentifizierung am IMAP Server fehlschlägt, schreibt sasl nach /var/log/auth.log. Procmail hatten wir ja in der procmailrc nach /var/log/procmail.tiberian geloggt. So können wir jeden Schritt nachvollziehen, wo die Mails hängengeblieben sind. Nicht zu vergessen ist auch, dass die Mails a) noch immer auf dem Servers unserers ISP sind (da -k) und b) das alle abgeholten E-Mails auch noch in die datei "savemails" kopiert wurden. Verloren geht also nichts. Wenn alles läuft, kann man den fetchmail mit dem Befehlsudo fetchmail -d 400 Als Daemon in den Hintergrund laden, der dann alle 400 Sekunden nach neuen E-Mails schaut.

Warum fetchmail als root?

Fetchmail meldet zum Start zu Recht, dass die Ausführung mit Root-Rechten wenig sinnvoll ist. Denn das ist sie in der Tat nicht. Allerdings ist es so, dass zur Weitergabe der Mails von Procmail an den Cyrus (über cyrdeliver) zwangsläufig rootrechte benötigt. Ich habe es bisher nicht geschafft, das ganze über einen normalen User abzuwickeln. Falls da jemand was weiß, wär ich für einen Kommentar dankbar.

Natürlich könnt Ihr auch die Kommentare für Fragen, Vorschläge und Kritik nutzen. Ich freue mich 🙂

24 comments

Hallo Michael

Mein Kommentar kommt ziemlich spät, aber ich habe diesen Beitrag gerade erst entdeckt… 😉

Jedenfalls: Vielen Dank für deine Ausführungen! Sie haben mir beim Aufsetzen eines IMAP-Servers im LAN sehr geholfen. Eine Frage habe ich aber noch: Offensichtlich hast du ja postfix nicht installiert; wie schickst du deine Emails ab? Gehe ich richtig in der Annahme, dass, wenn man seine Emails direkt über einen anderen Anbieter (z.B. mail.gmx.net) abschickt, die Installation von postfix überflüssig ist?

Tobi

PS: Das Design dieser Website ist der Hammer! 😀

by Tobi on 13. Januar 2008 at 17:04. #

danke für das Lob 🙂

Postfix ist in der Tat nicht installiert. E-Mails verschicken über einen lokalen Server macht auch wenig Sinn, da kein (Free)Mailer E-Mails von dynamischen IPs annehmen.
Stattdessen wie du schon sagst im E-Mail Client als SMTP-Server direkt den Dienst angeben (mail.gmx.net) und darüber die E-Mails verschicken.

by Michi on 13. Januar 2008 at 17:45. #

Danke für die schnelle Antwort! 🙂

Das habe ich mir schon gedacht. Aber einfach, wie ich gestrickt bin, habe ich einfach die Anweisungen auf ubuntuusers.de befolgt — dort wird die Installation von postfix vorausgesetzt… Ich werde aber wohl auf procmail umsteigen, d.h. postfix aussen vor lassen, damit ich spamassassin benutzen und zudem die Emails je nach Ursprungspostfach in verschiedene Mailboxes verteilen kann. Danke nochmals!

by Tobi on 13. Januar 2008 at 17:58. #

Führst du fetchmail immer noch als root aus? Auf ubuntuusers.de habe ich eine Anleitung für fetchmail gefunden, in der beschrieben wird, wie man fetchmail als Daemon ausführen kann. Vielleicht wär’ das was? 😉 Immerhin muss ich zugeben, dass ich mir nicht sicher bin, ob in diesem Fall fetchmail ebenfalls als root-Prozess läuft…

by Tobi on 15. Januar 2008 at 15:47. #

Ich führe fetchmail als Daemon aus. Anders geht es ja auch gar nicht. Allerdings muss dieser Daemon-Prozess eben mit root-rechten ausgeführt werden, da sonst die weitergabe an Procmail nicht funktioniert (die ausführung von procmail scheint wohl root rechte zu benötigen)

by Michi on 15. Januar 2008 at 16:57. #

Damit habe ich mich also wohl wirklich endgültig als noob geoutet… 😉 Ich werde mir weitere Kommentare also verkneifen.

by Tobi on 16. Januar 2008 at 08:38. #

[…] Aus diversesten Gründen musste der bisher bei mir im Einsatz befindliche Mailserver auf dem ein Cyrus-IMAPd mit Procmail, ClamAV und Spamassassin läuft und den namen “minerva” trägt durch eine neue, schnellere virtuelle Maschine basierend […]

by Cyrus IMAP mit SSL ausstatten | denkweite.de on 4. März 2008 at 00:17. #

Salut! Ich habe ein Problem 🙂 Habe alles, wei oben geschreiben steht auf meinem System eingestellt, es ist nur so, dass meine eMails nicht im Outlook zu sehen sind -> alles eMails, die fetchmail empfängt, landen im Verzeichnis /var/mail/user und nicht in /var/spool/imap/user/ 🙁 Vielleicht weiß jemand, woran es liegt und kann mir kurzes Info an slawa@mironow.de posten!

Danke im Voraus!

Slawa

by Slawa on 11. März 2008 at 12:46. #

Hier ist die Ausgabe von fetchmail:

Nachricht mironow@mx.freenet.de:2 von 2 wird gelesen (1643 Bytes)
#***procmail: Error while writing to „/var/log/procmail.slawa“
procmail: [7141] Tue Mar 11 14:45:37 2008
procmail: Assigning „LASTFOLDER=savemails“
procmail: Opening „savemails“
procmail: Acquiring kernel-lock
procmail: Match on “ QUIT
fetchmail: POP3< +OK
fetchmail: 6.3.8 fragt ab pop3.freenet.de (Protokoll POP3) um Di 11 Mär 2008 14:45:40 CET: Abfrage beendet
fetchmail: normale Beendigung, Status 0

by Slawa on 11. März 2008 at 12:52. #

Hallo Leute,

das Problem lag an der Einstellungen in /etc/cyrus.conf:

lmtp cmd=“lmtpd“ listen=“localhost:lmtp“ prefork=0
lmtpunix cmd=“lmtpd“ listen=“/var/lib/imap/socket/lmtp“ prefork=0

so soll es aussehen und so sah es aus:

#lmtp cmd=“lmtpd“ listen=“lmtp“ prefork=0
lmtpunix cmd=“lmtpd“ listen=“/var/lib/imap/socket/lmtp“ prefork=0

Gruß

Slawa

by Slawa on 11. März 2008 at 16:24. #

Hallo Michael,

eine sehr schöne Anleitung.
Habe aber noch eine Frage: wie ist die procmailrc anzupassen damit das Ganze auch für mehrere Benutzer funktioniert? Mein Ansatz wäre, nach Empfänger zu filtern. Kenne mich aber leider mit der procmailrc-Syntax nicht so gut aus.

Gruß,
Alex

by Alex on 4. April 2008 at 16:16. #

Salut Alex!

.procmailrc habe ich in Home-Verzeichnis von jeweil einem User angelegt und sich mit jeweils diesem User über ssh eingeloggt und fetchmail -d 400 gestartet. Danach bin ich ausgeloggt und als root in /etc/passwd für alle user /bin/false geschrieben.

Es funktioniert!

by Slawa on 4. April 2008 at 16:52. #

Das ist sicher ne Lösung, aber nicht die Beste. Schließlich ist procmail ja dafür da, an mehrere benutzer zu verteilen. Und für jeden User einen fetchmail Daemon laufen zu haben halte ich für Ressourcenverschwendung.
Allerdings weiß ich nicht ganz genau, wie das ganze für Mehrbenutzer in der procmail aussehen müsste. Der Ansatz über den Empfänger ist aber richtig (bzw. filter nach ‚delivered-to:‘)
Ich mach mich mal schlau und schreib bei Gelegenheit was drüber 🙂

by Michi on 4. April 2008 at 16:56. #

Hallo Michael,
schöne Anleitung – auch wenn ich hier nicht das finde, wonach ich eigentlich gesucht habe. Trotzdem habe ich bei fetchmail noch eine Anmerkung: fetchmail benötigt keine root-Rechte. Ich habe das Ganze immer unter dem user „mail“ laufen. Gestartet wird der daemon dann z.B. mit su mail -c „fetchmail -d300“. Wichtig ist dabei nur – und daran habe ich beim ersten Mal tagelang probiert – dass die Gruppenzugehörigkeit stimmt, also cyrus, postfix und fetchmail zur Gruppe mail gehören. Ansonsten kann fetchmail nicht liefern. Falls Du für Deine Anleitung noch weitere Details brauchst, schreib‘ bitte (ausnahmsweise) als PM ohne meine Adresse zu veröffentlichen, da ich eher zufällig hier gelandet bin.

Gruß
Daniel

by Daniel Zur on 22. April 2008 at 13:44. #

Hi Daniel,
danke für den guten Hinweis! Hätte ich auch drauf kommen müssen eigentlich ;o)
Ich werde das die Tage mal ausprobieren, und wenn es klappt hier mit in das How-To übernehmen.

Danke nochmals..

by Michi on 22. April 2008 at 17:20. #

Hallo,
hab Dein HowTo über den lokalen Mailserver gelesen.
Finde den Ansatz garnicht schlecht, und will das ausprobieren.
Aber eine Frage habe ich dazu:

Es soll kein Postfix installiert sein, oder werden??
Wenn man Pakete wie cyrus22-imapd cyrus22-admin über apt-get installiert,
werden zusätzliche Packete unter anderem auch Postfix installiert.

by michael on 5. Mai 2008 at 17:42. #

Möglich, dass postfix mitinstalliert wird. Ist aber nicht weiter schlimm. Es wird einfach nicht konfiguriert bzw. genutzt… 🙂

by Michi on 5. Mai 2008 at 17:57. #

Hallo Michi,

ich frage mich gerade, ob und wenn ja wie die ausgehenden eMails
im IMAP-Server sichtbar sind. Speichert der Client eine Kopie im Server?

by bluenix on 12. Mai 2008 at 22:03. #

Ja, das ist Clientsache. Thunderbird zB legt innerhalb des IMAP-Ordners INBOX einen ordner „Sent“ an, in dem es dann die gesendeten Mails speichert. Somit sind auch diese auf dem IMAP-Server gespeichert.

by Michi on 13. Mai 2008 at 09:58. #

Hallo,

kleine Frage:
Woher weiß in deiner Einstellung „fetchmail“ von welcher Domain er die Konten abrufen soll? Nur der POP3-Server wird da sicher nicht reichen. Also fehlt da doch noch „localdomains xyz.de“ oder so ähnlich.

by Daniel on 16. Mai 2008 at 08:51. #

Nö eigentlich nicht. Durch die Kombination POP3-Server, Benutzername und Passwort weiß der POP3 Server schon, welches Konto bzw. Domain damit gemeint ist 😉

by Michi on 16. Mai 2008 at 09:10. #

Okay,

danke. Jetzt weiß ich auch, wo der Denkfehler bei mir lag.

by Daniel on 16. Mai 2008 at 09:23. #

hi,
also erst mal super fettes lob an deine anleitung !
hat mir echt sehr geholfen 🙂
einziges problem was ich nun habe ist, dass sich nun auch freunde bei mir melden und die auch den service ohne spam genießen möchten, will ich nun mehrere mailserver abfragen (eben die was die freunde haben wollen) und dann anschliessend genau so per procmail + spamassassin durchlaufen lassen und dann per cyrus bereitstellen.
wie müsste ich da vorgehen ?
würde mich riesig über eine antwort freuen !!!

schönen gruss aus dem schönen österreich,
chris 🙂

by Chris on 28. September 2008 at 16:16. #

ok habs selbst geschafft 😉
einfach für jeden user eine .fetchmailrc und .procmailrc erstellen, chmod 0710 auf beide files, und fertig.
wegen deinem problem, die mails ohne root rechte abzuholen …
hab eine lösung für dir …
schmeiss doch die user die den befehl fetchmail -d 400 ausführen sollen in die gruppe „mail“ und gut is … funtzelt bei mir ohne probs …

by Chris on 4. Oktober 2008 at 23:01. #

Leave your comment

Required.

Required. Not published.

If you have one.



Piwik encoutered an error: Uncaught exception 'Exception' with message 'Piwik and/or some plugins have been upgraded to a new version. --> Please run the update process first. See documentation: http://piwik.org/docs/update/ ' in /var/www/stats.mail.feinbier.net/html/plugins/CoreUpdater/CoreUpdater.php:73 Stack trace: #0 [internal function]: Piwik\Plugins\CoreUpdater\CoreUpdater->dispatch() #1 /var/www/stats.mail.feinbier.net/html/core/EventDispatcher.php(141): call_user_func_array(Array, Array) #2 /var/www/stats.mail.feinbier.net/html/core/Piwik.php(701): Piwik\EventDispatcher->postEvent('Request.dispatc...', Array, false, NULL) #3 /var/www/stats.mail.feinbier.net/html/core/FrontController.php(306): Piwik\Piwik::postEvent('Request.dispatc...') #4 /var/www/denkweite.de/html/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(38): Piwik\FrontController->init() #5 /var/www/denkweite.de/html/wp-content/plugins/wp-piwik/classes/WP_Piwik/Request/Php.php(16): WP_Piwik\Request\Php->call('method=SitesMan...', 'http://stats.ma...', ' (which lead to: Session must be started before any output has been sent to the browser; output started in /var/www/denkweite.de/html/wp-includes/formatting.php/5081)