Liste verschiedener Procmail-Rezepte

Dieses Buch steht im Regal EDV.

Wikipedia hat einen Artikel zum Thema:

Einleitung Bearbeiten

In diesem Artikel sollen fertige Rezepte für den MDA Procmail gesammelt werden, die alltägliche Aufgaben der E-Mail-Filterung wie das Aussortieren von Spam-Mails 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.

Hinweis

Diese Zeilen müssen in die Datei $HOME/.procmailrc eingetragen werden! Zu Procmail gehörende Dateien wie Log- oder Killfiles liegen in den Beispielen in einem Verzeichnis, dass über $PMDIR angegeben wird.

Adressen Bearbeiten

Killfile (Blacklist) Bearbeiten

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 Zeile für Zeile die Liste der unerwünschten Absenderadressen:

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.

Whitelists (bekannte Adressen) Bearbeiten

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/

Zur Erklärung dieses Rezepts siehe den obigen Abschnitt zu Blacklisten.

VCard-Adressbuch als Whitelist Bearbeiten

Auch ein VCard-Adressbuch, wie es etwa Kontact 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 -qis $FROM
$MAILDIR

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.

Automatisch versendete E-Mails (Nicht-Spam) Bearbeiten

Bugzilla Bearbeiten

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.

Flyspray Bearbeiten

Ein weiteres Bug-Tracking-System.

:0
* ^Subject: Flyspray task #[0-9]+
.bugs/

Mailing-Listen Bearbeiten

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").

Spamassassin Bearbeiten

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 Spamassassin eine Zeit lang getestet hat und keine fälschlicherweise einsortierten Mails vorfindet, kann man dieses Verzeichnis durch /dev/null ersetzen, um sich manuelles Löschen zu ersparen.

Dateianhänge Bearbeiten

Dateien über einer bestimmten Größe löschen Bearbeiten

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 muss zum Beispiel 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 sind (ca. 1MB), nach /dev/null. Damit werden sie gelöscht.

Virencheck Bearbeiten

Als Virusscanner läuft CLAMDSCAN als Daemon im Hintergrund. Die Mail wird gescannt, 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 Kopie in die Quarantäne geschoben, das Original wird mit Exitcode=99 dann ins Nirwana „gesendet“. Achte darauf, dass du am Anfang die Variablen richtig setzt.

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
}
}

Sonstiges Bearbeiten

HTML-Mails als Plain-Text formatieren Bearbeiten

Folgende Regel nutzt Lynx, um HTML-Mails in Text-Mails umzuwandeln:

:0f
* ^Content-Type: text/html
| lynx -dump -force_html -stdin | formail -i "Content-Type: text/plain"

Kaputte Betreffzeilen reparieren Bearbeiten

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;'

außerdem

:0 fhw
* Subject:[ \t]*(aw|tr|we):
| sed -e 's/^Subject:[ \t]*\(Aw\|Tr\):/Subject: Re:/i'