Procmail Kochbuch
Aus Wikibooks
Inhaltsverzeichnis |
[Bearbeiten] Über dieses Buch
In diesem Buch sollen fertige Rezepte für den MDA Procmail gesammelt werden, die alltägliche Aufgaben der E-Mail-Filterung, wie das Aussortieren von Spam-Mails, zu erledigen. Es soll Neulingen die Fähigkeiten des Programmes aufzeigen und helfen, die teils recht komplexen Themen wie den Umgang mit regulären Ausdrücken oder das Bearbeiten von Mail-Headern anhand von konkreten Beispielen zu verstehen und somit andere in die Lage versetzen, Rezepte für eigene, speziellere Aufgaben zu verfassen.
Autoren:
- Bitte schreibt zu jedem Rezept sowohl eine Beschreibung der Funktion als auch eine Erklärung.
- Zu Procmail gehörende Dateien wie Log- oder Killfiles liegen in den Beispielen in einem Verzeichnis, dass über $PMDIR angegeben wird.
[Bearbeiten] Adressen
[Bearbeiten] Killfile (Blacklist)
Ein Killfile ist eine Datei, die die Adressen von Personen enthält, deren Nachrichten man nicht lesen möchte. Das folgende Rezept löscht solche Mails automatisch:
FROM=`formail -xFrom: | sed -e 's/ *(.*)//; s/>.*//; s/.*[:<] *//'` :0 * ? fgrep -qxis $FROM $PMDIR/killfile /dev/null
Die Datei $PMDIR/killfile enthält die Liste der unerwünschten Absenderadressen, Zeile für Zeile:
eins@example.com zwei@example.net drei@example.org
Erklärung: formail extrahiert den From-Header, bei dem dann das "From:" und der Name entfernt werden (aus "From: Wiki User <wikiuser@example.com>" wird "wikiuser@example.com"). Per fgrep wird dann diese Adresse gegen eine Datei mit Mail-Adressen geprüft und bei einem Treffer die komplette Mail nach /dev/null geschoben.
[Bearbeiten] Whitelists (bekannte Adressen)
Eine Whitelist ist das Gegenteil des Killfiles: Mails von bekannten Personen werden explizit nicht gefiltert.
Das Verwenden von whitelists ist aus vielerlei Gründen nützlich:
- E-Mails von Absendern, die ein Spam-Filter fälschlicherweise häufig als Spam erkennt, werden zuvor aussortiert.
- Das Umgehen des Spam-Filters spart Ressourcen, was insbesondere SpamAssassin-Nutzer mit schwachen Rechnern zu schätzen wissen.
- Mails von bestimmten Personengruppen können direkt in spezielle Ordner wie "Geschäftlich" oder "Privat" sortiert werden.
Sinnvollerweise sollten die Regeln für Whitelists vor den Spam-Filtern, aber hinter Rezepten zum sortieren von erwünschten, automatisch versendeten Mails stehen (Es könnte ja zum Beispiel sein, dass jemand, der auf einer "Freunde"-Whitelist steht, auch auf einer gemeinsam genutzten Mailingliste schreibt und die entsprechenden Mails daher nicht ins "Privat"-Verzeichnis gehören).
Diese Rezepte sortieren Mails von Freunden in den Ordner "privat" und Kunden-Korrespondenz in den Ordner "geschäftlich". Die Adress-Dateien haben das selbe Format wie im Killfile-Beispiel.
FROM=`formail -xFrom: | sed -e 's/ *(.*)//; s/>.*//; s/.*[:<] *//'` :0 * ? fgrep -qxis $FROM $PMDIR/freunde .privat/ :0 * ? fgrep -qxis $FROM $PMDIR/kunden .geschaeftlich/
Erklärung: siehe Blacklist.
[Bearbeiten] VCard-Adressbuch als Whitelist
Auch ein VCard-Adressbuch, wie es etwa KMail standardmäßig zum Speichern der Adressen nutzt, lässt sich einfach als Whitelist benutzen:
FROM=`formail -xFrom: | sed -e 's/ *(.*)//; s/>.*//; s/.*[:<] *//'` :0 * ? grep "^EMAIL:" $PMDIR/addressbook.vcf | sed s/^EMAIL:// | fgrep -qxis $FROM $MAILDIR
Achtung: Diese Regel scheint so nicht zu funktionieren - man muss grep ohne die -x Option benutzen. Wahrscheinlich liegt dies am Format von VCard, wer näheres dazu weiß, bitte ergänzen.
Erklärung: Im Unterschied zur fertigen Datei mit E-Mail-Adressen enthält eine VCard-Datei mehr Daten: Namen, Telefonnummern, etc. Daher nutzen wir zunächst grep, um die Zeilen mit den Mail-Adressen zu bekommen. Das Anfängliche "EMAIL:" wird von sed entfernt und die Adressen danach wie gewohnt mittels fgrep gegen die Absenderadresse der eingegangenen Mail geprüft.
[Bearbeiten] Automatisch versendete E-Mails (Nicht-Spam)
[Bearbeiten] Bugzilla
Bugzilla ist ein System zum Melden und Diskutieren von Fehlern in Softwareprodukte. Die Entwickler und der Meldende werden durch E-Mails über Neuigkeiten zu diesem Problem informiert.
:0 * ^Subject: \[Bug [0-9]+\] .bugs/
Erklärung: Betreffszeilen von Bugzilla-Mails beginnen mit "[Bug 123]", wobei 123 eine fortlaufende Nummer ist.
[Bearbeiten] Flyspray
Ein weiteres Bug-Tracking-System.
:0 * ^Subject: Flyspray task #[0-9]+ .bugs/
[Bearbeiten] Mailing-Listen
Mailing-Listen sortiert man am einfachsten anhand der Listen-Adresse ein:
:0 * ^TO_cool-mailinglist@example.com .cool-mailinglist/
Erklärung: Procmail bietet mit "TO_" eine komfortable Möglichkeit, auf E-Mail-Adressen zu prüfen (das TO_ wird durch einen komplexen regulären Ausdruck ersetzt (siehe procmailrc(5), Abschnitt "MISCELLANEOUS").
[Bearbeiten] Spam
[Bearbeiten] Provider-Tests
Viele Provider führen bereits auf ihrem Server Spam-Tests durch. Vertraut man diesen, kann man sich rechenintensive Programme wie Spamassassin auf dem eigenen Rechner oft sparen.
- GMX fügt einen Text in die Betreffszeile ein:
* ^*** GMX Spamverdacht *** - HostEurope fügt einen eigenen Header ein. Alle Mails mit einem Spam-Level von 5 und höher filtert diese Bedingung:
* X-HE-Spam-Level: \+\+\+\+\+
[Bearbeiten] Spamassassin
Spamassassin ist das wohl bekannteste Programm zum Filtern unerwünschter Werbemails. Die Einrichtung und Konfiguration des Programms ist nicht Ziel dieses Buches und kann an verschiedenen Stellen im Netz nachgelesen werden. Sollten diese Anleitungen nicht auf procmail eingehen, hier die benötigten Rezepte:
:0fw | /usr/bin/spamc :0 * ^X-Spam-Status: Yes .spam/
Erklärung: Zunächst werden alle Mails, die noch nicht z.B. durch eine Whitelist einsortiert wurden, durch den Filter gejagt. Die Flags f und w sorgen dafür, dass procmail wartet, bis das Programm fertig ist. Danach werden alle E-Mails auf den Header "X-Spam-Status" geprüft und Spam-Mails in ein eigenes Verzeichnis sortiert. Wenn man SA eine Zeitlang getestet hat und keine fälschlicherweise einsortierten Mails vorfindet, kann man dieses Verzeichnis durch /dev/null ersetzen, um sich manuelles Löschen zu ersparen.
[Bearbeiten] Bogofilter
[Bearbeiten] Dateianhänge
[Bearbeiten] Dateien über einer bestimmten Größe löschen
Da Spammer zwar massenweise Mail generieren, diese aber vergleichsweise klein sind, ist es oft sinnvoll, nur Mails bis zu einer bestimmten Größe auf Spam zu überprüfen. Dies entlastet die Maschine teilweise erheblich. Um Dateien einer bestimmten Größe zu bearbeiten muß z.B. die weiter oben aufgeführte Regel, die alle Mails an /usr/bin/spamc übergibt wie folgt geändert werden:
:0fw * <150000 | /usr/bin/spamc
Damit werden alle Maildateien, die kleiner als 150.000 Bytes sind, durch Spamassassin überprüft.
Um Dateien ab einer bestimmten Größe zu löschen wird eine weitere Regel in das Rezept eingefügt:
:0 * >1024000 /dev/null
Diese Regel verschiebt alle Mails die größer als 1024000 Bytes (ca. 1MB) nach /dev/null, d.h. sie werden gelöscht.
[Bearbeiten] Virencheck
Als Virusscanner läuft CLAMDSACN als Daemon im Hintergrund. Die Mail wird gesannt, die "verseuchte" Mail wird in Quarantäne geschoben. Der Empfänger erhält eine Nachricht mit den ersten 50 Zeilen der Mail. Da hier vmailmgr läuft, wird eine Copy in Quarantäne geschoben, das "original" mit Exitcode=99 dann ins Nirwana "gesendet". Am Anfang die Variablen setzen!
CLAMSCAN=/usr/local/bin/clamdscan VIRUSTARGET=$MAILDIR/users/virus/
# Mail an Virusscanner
:0
*
{
AV_REPORT=`clamdscan --stdout --disable-summary - | awk '$3=="FOUND"{print "YES "$2}$3!="FOUND"{print "No"}'`
:0fw
| formail -i "X-Virus: $AV_REPORT"
}
# Auswertung, ob Virus gefunden, X-Loop damit keine Schleife entsteht
:0
* ^X-Virus: Yes
* !^X-Loop: loopadmin_mailserver
{
TMPFILE=tmp.$$
SEND=`formail -xFrom:|sed -e 's/^[ ]*//g'`
SUBJ=`formail -xSubject:|sed -e 's/^[ ]*//g'`
# der Empfänger wird hier aus qmail+vmailmgr ausgelesen, bitte anpassen:
RECI=`formail -xDelivered-To:|sed -e 's/^[ ]virtual_Domainuser-//g'`
VIRUS=`formail -xX-Virus:|sed -e 's/^[ ]YES//g'`
:0cw:
$VIRUSTARGET
:0 awc:
$TMPFILE
:0
{
EXITCODE=99
:0 ah
| (formail -rA "X-Loop: loopadmin_mailserver" \
-I "Precedence: warn" \
-I "To: $RECI" \
-I "From: merlin@xyz.de" \
-I "Subject: Blocked Virus:$VIRUS" ; \
echo "Eine an Sie adressierte Mail von: $SEND" ; \
echo "mit dem Betreff: $SUBJ" ; \
echo "wurde gesperrt. Virus$VIRUS gefunden!" ; \
echo "Die Mail wurde in Quarantäne verschoben!" ; \
echo "" ; \
echo "Die ersten 50 Zeilen der originalen Mail folgen..." ; \
echo "------------------------------------------------" ; \
head -50 ./$TMPFILE) \
| /usr/sbin/sendmail -oi -t -f'merlin@xyz.de'; \
rm -f $TMPFILE
:0w:
/dev/null
}
}
[Bearbeiten] Löschen bestimmter Dateitypen
[Bearbeiten] Sonstiges
[Bearbeiten] HTML-Mails als Plain-Text formatieren
Meine Lösung sieht so aus. Da sind gewiß Fehler drin - aber es funktioniert ganz gut! :-) Und da eine schlechte Lösung besser als keine ist...
In meinem .procmail steht:
:0hb: * .*html|^Content-Type:.*text/html|^Content-Type:.*multipart/alternat|\ (<body>)|(<html>)|(</body>)|(</html>) | /home/lenz/Bin/script_antihtml
Mein /home/lenz/Bin/script_antihtml sieht so aus:
#!/bin/sh touch /home/lenz/htmlmail rm /home/lenz/htmlmail # Damit kein htmlmail existiert, aber es auch keine Fehlermeldung # gibt, wenn man ein nichtexistentes /home/lenz/htmlmail löschen will cat > /home/lenz/htmlmail # Jetzt gibt es wieder eines, besteht aus der zu filternden Mail ex /home/lenz/htmlmail < /home/lenz/Ex-Scripte/antihtml # Da läuft jetzt ein Ex-Script drüber - # den Ex-Editor hat jeder, der den vi installiert hat cat /home/lenz/htmlmail >> /var/spool/mail/lenz # Das Ergebnis geht in meine Mailbox.
Und hier mein Ex-Script (/home/lenz/Ex-Scripte/antihtml), das Kernstück.
# Erstmal die zerpflückten Zeilen zusammenfügen. (Kann man nicht in der Zeile "global" ausführen.): g/=$/j g/=$/j g/=$/j g/=$/j g/=$/j # Dann die Tags weg, aber nicht die E-Mail-Adressen im Header # und außerdem nicht, wenn ein ">" im Tag wäre (das berücksichtig das "greedy"-Verhalten # von "regular expressions".: g/<[^@>]*>/s///g # Dann anderen Quatsch austauschen: g/=F6/s//ö/g g/=FC/s//ü/g g/=E4/s//ä/g # Im Ernstfall die "_" weglassen. Muß ich hier machen, sonst wird es vom Server als <TAG> interpretiert. g/&_nbsp_;/s// /g g/= /s///g g/=20/s///g # # Speichern: x
[Bearbeiten] Kaputte Betreffzeilen Reparieren
Oft findet man in Mailinglisten solche Betreffzeilen:
Re: AW: AW: AW: AW: AW: AW: AW: Linux rules (-:!
um das zu einer schöneren Form zu bringen, schreibt man das in seine Procmailrc:
:0 fh * ^Subject:[ ]*(Re:\s*|AW:\s*|SW:\s*|WG:\s*|HW:\s*|WE:\s*|Antwort:\s*)+ | perl -pe 's/^Subject:\s+(?:Re:\s*|AW:\s*|SW:\s*|WG:\s*|HW:\s*|WE:\s*|Antwort:\s*)+(.*)/Subject: Re: $1/i;'
und
:0 fhw * Subject:[ \t]*(aw|tr|we): | sed -e 's/^Subject:[ \t]*\(Aw\|Tr\):/Subject: Re:/i'
[Bearbeiten] Weblinks
[Bearbeiten] Komplette rc-files
- http://linuxbrit.co.uk/downloads/dot.procmailrc (wird hier nach und nach eingefügt und auf Deutsch erklärt werden)

