Automatisch Procmailregeln per Script erstellen

Procmail ist ein sehr sehr mächtiges Tool. Ich habe mir mal ein kleines Bash Script geschrieben, mit dem man automatisch per Crontable gesteuert die Filterregeln erstellen kann. Man muss lediglich die Emails in die entsprechenden Ordner verschieben und nachts das Script laufen lassen. Das Script geht durch die entsprechenden Ordner der Mailbox, liest die Absender der vorhandenen Emails aus und schreibt diese in eine Liste. In dieser Liste steht dann der Ordnername und die Absenderadresse im Format:

Ordnername;absender@domain.org

Anschließend wird diese Liste gelesen und auf doppelte Einträge gefiltert. Nachdem die doppelten Einträge und Leerzeichen etc. aus der Datei entfernt sind erstellt das Script für jeden Eintrag einen Procmailkonformen Regelsatz. Wenn die Regeln erstellt wird schaut das Script ob im Verzeichnis des angegebenen Benutzers die Datei .procmailrc existiert. Wenn die Datei existiert wird zunächst ein Backup der Datei angelegt und anschließend geprüft, ob bereits Regeln über das Script eingefügt worden sind. Ist das der Fall werden diese Regeln zunächst aus der Datei entfernt. Anschließend werden die frischen Regelsätze an die Datei angehangen.

Aufgerufen wird das Script einfach mit ./procmailregeln.sh <Benutzername>. Das Script erwartet ein Homeverzeichnis unter /home/<Benutzername> und dort eine Maildir Struktur unter /home/<Benutzername>/mails. Außerdem sollte bereits eine .procmailrc im Homeverzeichnis des Benutzers vorhanden sein. Wenn nicht lässt sich diese mit touch .procmailrc recht einfach erzeugen. Wenn das Script diese Datei nicht vorfinden kann erstellt es zwar die Regeln, kann diese aber nicht an die Datei anhängen. Die Regelsets werden nach dem Scriptlauf automatisch gelöscht. Sollte dies nicht gewünscht sein einfach die entsprechenden „rm“s im Script mittels „#“ auskommentieren.

Fertig.

Das Script ist sehr einfach gehalten und bietet noch jede Menge Optimierungspotential. Ich habe mich bemüht es für Anfänger so einfach wie möglich zu gestalten – und so z.B. auf die liebgewonnenen Verkürzungen von z.B. if verzichtet. Wenn ihr das Script gespeichert habt nicht vergessen es mit chmod 755 <Scriptname> ausführbar zu machen!

Das automatische Einplanen kann mittels Cron z.B. so aussehen:

crontab -e

20 3 * * * /usr/local/bin/procmailregeln.sh <Benutzername>
Verbesserungen sind wie immer gern gesehen!

#!/bin/bash
# Tool zum automatischen Erstellen von Procmail Regeln anhand
# der Sortierungen in den Ordnern

if [ $# = 0  ]
then
echo „Es wurde kein Benutzer uebergeben.“
echo „Bitte so aufrufen: $0 <user>“
exit 0
fi

#Variablen definieren
USER=$1
MAILS=/home/$USER/mails/
ADRESSEN=/home/$USER/addressen.txt
REGELN=/home/$USER/regeln.txt
ORDNERLISTE=/home/$USER/ordnerliste.txt
PROCRC=/home/$USER/.procmailrc

# In den Mailordner wechseln
cd $MAILS

#Alte Adressen Datei von abgebrochenem Lauf loeschen wenn vorhanden
if [ -f $ADRESSEN ]
then
rm $ADRESSEN
fi

#Alte Ordnerliste von abgebrochenem Lauf loeschen wenn vorhanden
if [ -f $ORDNERLISTE ]
then
rm $ORDNERLISTE
fi

#Alte Regeln von abgebrochenem Lauf loeschen wenn vorhanden
if [ -f $REGELN ]
then
rm $REGELN
fi

#Liste der vorhandenen Mailordner abzueglich Inbox, Trash, Spam, Sent, Drafts anlegen
#Zeilen der Ordnerliste ermitteln
LAENGE=$(ls -d ${MAILS}.* | grep -v -e tmp -e subscriptions  -e dovecot -e 238 -e new -e cur -e .Spam -e .Trash -e Sent -e Drafts -e Draft -e Junk -e Junks| wc -l)
#Laenge um 2 kuerzen wegen . und ..
let LAENGE=$LAENGE-2
#Zu bearbeitende Ordner in Listenform in eine Datei schreiben
ls -d ${MAILS}.* | grep -v -e tmp -e subscriptions  -e dovecot -e 238 -e new -e cur -e .Spam -e .Trash -e Sent -e Drafts -e Draft -e Junk -e Junks | tail -n$LAENGE >$ORDNERLISTE

#Wenn keine Ordner da sind abbrechen
if [ $LAENGE -lt 1 ]
then
# echo „Keine Ordner zu bearbeiten.“
exit 0
fi

#Fuer jeden Ordner in der Emailliste alle Mails in diesem Ordner auf den Absender untersuchen
#und den Ordnernamen sowie den Absender per ; getrennt in eine Datei schreiben
ZAHL=0
while [ $ZAHL -lt $LAENGE ]
do
let ZAHL=$ZAHL+1
VERZEICHNIS=$(head -n$ZAHL $ORDNERLISTE | tail -n1)

for d in $( ls ${VERZEICHNIS}/cur/* 2>/dev/null )
do
if  [ -f $d  ]
then
echo „$(echo $VERZEICHNIS | awk -F“/mails/“ ‚{ print $2 }‘ );“$(cat $d | formail -xFrom: | sed -e ’s/ *(.*)//; s/>.*//; s/.*[:<] *//‘ | sed -e ’s/\ //‘ | sort -u ) >> $ADRESSEN
fi
done
done
#Alte Ordnerliste nach Bearbeitung der Ordner loeschen
if [ -f $ORDNERLISTE ]
then
rm $ORDNERLISTE
fi

#Der Sort im While-Block funktioniert nicht immer richtig.
#Also noch mal mal die Liste Unique sortieren und Leerzeichen entfernen
cat $ADRESSEN | grep -i „@“ | sed ’s/\ //g‘ | sort -u > $ADRESSEN.neu
mv $ADRESSEN.neu $ADRESSEN

#Die Adressliste in eine fücmail lesbare Form bringen
#Jeder Eintrag in der Liste erteugt einen Procmaileintrag
for i in $(cat $ADRESSEN | grep -v „^.;“)
do
ORDNER=$(echo $i | awk -F“;“ ‚{ print $1 }‘)
MAIL=$(echo $i | awk -F“;“ ‚{ print $2 }‘ )
echo „#$MAIL“ >> $REGELN
echo „:0“ >> $REGELN
echo „* ^From:.*${MAIL}“ >> $REGELN
echo „\$MAILDIR/${ORDNER}/“ >> $REGELN
echo „“  >> $REGELN
ORDNER=““
MAIL=““
done

#Nach erstellung des Procmail Regelsets kann die Ordnerliste mit den Emailadressen geloescht werden
if [ -f $ADRESSEN ]
then
rm $ADRESSEN
fi

#Die erstellten Procmailregeln an die Procmaildatei anhaengen und bestehende vom Script erstellte
#Procmailregeln vorher loeschen. Vorher noch ein Backup der .procmailrc anlegen.
if [ -f $PROCRC ]
then
cp $PROCRC $PROCRC.backup
AUTOZEILE=$(grep -n  „#####Automatische Procmailregeln“ $PROCRC | awk -F: ‚{print $1}‘ | head -n1)
let AUTOZEILE=$AUTOZEILE-1
head -n $AUTOZEILE < $PROCRC > $PROCRC.rmauto
mv $PROCRC.rmauto $PROCRC
echo „#####Automatische Procmailregeln“ >> $PROCRC
cat $REGELN >> $PROCRC
rm $REGELN
chown $USER:$USER $PROCRC
fi

exit 0

Download

About the author