Inhalt
Inhaltsverzeichnis
Maildrop ist ein Teil des Courier MailServers, der auch einzeln verwendet werden kann. Maildrop ist ein sogenannter MDA.
Maildrop lässt sich deutlich besser konfigurieren als procmail - dazu wird im Homeverzeichnis eine Datei .mailfilter angelegt.
Homepage: http://www.flounder.net/~mrsam/maildrop/
Lizenz: GPL
1. Beispiel einer .mailfilter
Hier das Beispiel von procmail für maildrop:
DEFAULT=Maildir/ logfile $DEFAULT/maildrop.log xfilter "/usr/local/bin/spamassassin -P" if (/^X-Spam-Status: Yes/) to $DEFAULT/.Spam/ if (/^Subject: Cron/) to $DEFAULT/.System/ if (/^From wiki@/) to $DEFAULT/.Wiki/ if (/^Subject:.*\[hylafax-users\]/) to $DEFAULT/.Hylafax/ if (/^Return-Path:.*syslinux/) to $DEFAULT/.Syslinux/
2. Tipps & Tricks
Die .mailfilter Datei darf nur vom Besitzer les- und schreibbar sein, maildrop verweigert sonst aus Sicherheitsgründen die Arbeit. Um die richtigen Rechte zu setzen, kann man folgenden Befehl ausführen: chmod 600 ~/.mailfilter
Wenn man Maildirs benutzt, muss man darauf achten, dass diese vorhanden sind, wenn man dorthin ausliefern will.
Wenn man Weiterleitungen an andere Adressen aktiv hat, sollte man darauf achten, Fehlermeldungen des Mailservers nicht weiterzuleiten, sonst kann es zu ärgerlichen Mail-Schleifen kommen.
if (/^Return-Path: <>/) to Maildir/
2.1. Mailinglisten
Für MailingListen empfiehlt sich folgende Pattern-Syntax (Beispiele), je nach MailingListenManager:
- Courier mlm
/^List-Post: <mailto:vlug-public@vlugnet.org>/
- GNU mailman
/^List-Id:.*<fsfe-de\.fsfeurope\.org>/
- ezmlm
/^Mailing-List: contact getmail-help@discworld\.dnsalias\.org/
- majordomo
/^Sender: owner-vlug@listserv\.uni-stuttgart\.de/
2.2. Weiterleitung
Beim Weiterleiten von Mails an einen anderen Server, kann es vorkommen, dass dieser die Mail nicht akzeptiert, da die Absenderadresse nicht mit dem sendenden Rechner übereinstimmt (besonders bei Mails von großen Hostern wie Yahoo oder AOL).
Als Lösung kommen mehrere Möglichkeiten in Frage:
- Weiterleitung der Mails als Anhang
if (/^Subject:.*/) SUBJECT=$MATCH xfilter "makemime -c message/rfc822 -e quoted-printable -a 'Mime-Version: 1.0' -a $SUBJECT -" to "!weiterleitungsadresse@anderer.server"
- Ändern des "From:"-Headers
xfilter "reformail -R From: X-Original-From: -I'From: <meineadresse@meinserver>'" to "!weiterleitungsadresse@anderer.server"
- dem Server beibringen, alle Mails zu akzeptieren
2.3. Syntaxprüfung
echo | maildrop -V 1 2>/dev/null && echo "OK" || echo "Error $?"
Maildrop beendet sich mit Fehlercode 75 (temporärer Fehler), wenn die Berechtigungen nicht in Ordnung sind oder die Syntax fehlerhaft ist.
3. Weitere Beispiele
Hier sind weitere Beispiele für maildrop-Filterregeln (teilweise basierend auf der maildropex ManPage).
3.1. Muster
Siehe auch RegularExpressions.
komplette E-Mail-Adresse
/^From: .*user@example\.com/
alles von hotmail.com außer fritz
/^From: .*@hotmail\.com/ && !/^From: .*fritz@hotmail\.com/
Zeichenkette (case-insensitive)
/^From: .*Max Mustermann/
Zeichenkette (case-sensitive)
/^From: .*Max Mustermann/:D
Zeichenkette im Body
/blafusel/:b
3.2. Regeln
Speichere eine Kopie jeder Mail im Unterordner backup und behalte nur die 50 letzten.
cc Maildir/.backup `cd Maildir/.backup/new && ls -t | sed -n 51,\$p | xargs -r rm`
OffeneFrage: Ich möchte gerne die Einträge in to und cc absuchen und in E-Mail-Adressen aufspalten. Normalerweise käme man mit getaddr(...) aus, doch diese Funktion liefert aus
"joe@domain.tld, "Alex Smith" <alex@domain.tld>, tom@domain.tld"
(siehe Manual) nur
"joe@domain.tld<NL>alex@domain.tld<NL>tom@domain.tld<NL>".
Ich möchte aber in einem weiteren Teil "Alex Smith" abtrennen können - wo diese Werte vorhanden sind. Meinen Namen kenne ich, der Spammer - so er einen Namen benutzt kennt ihn nicht und so würde ich - falls vorhanden und falsch - dies als Kriterium für Spam werten wollen. Mein erster Versuch bezieht sich auf die To-Zeile und lautet:
logfile logfile.txt log "Tests: TO an CC" if (/^To: (.*)$/) { ADRS = tolower($MATCH1) log "To-Zeile: $ADRS" foreach /(.*)(,$)/ { ADR = "$MATCH1" log "Weiterer Adresse: $ADR" } }
Aber das funktioniert nicht. Hier bräuchte man ein foreach-Beispiel, dass zeigt, wie es geht.