Sieve

Die Filtersprache Sieve ermöglicht das Erstellen von Mailfiltern auf dem neuen Mailsystem des FB3 mit Hilfe von Skripten, die nach einem einfachen Prinzip aufgebaut sind. Für diejenigen, die Sieve-Skripte selbst schreiben möchten, soll dieses Tutorial einen kleinen Einblick in die Sprache geben. Um Filter zu erstellen, ohne sich mit Sieve auseinandersetzen zu müssen, kann das Webinterface verwendet werden. Selbst geschriebene Skripte können damit ebenfalls angelegt werden.

Sieve-Module

Für jede Aktion, wie z.B. das Verschieben von E-Mails in einen IMAP Ordner oder das automatische Markieren von Nachrichten als gelesen, muss ein entsprechendes Modul bzw. eine Erweiterung geladen werden. Dieses geschieht einmalig im Kopf einer Sieve-Skript Datei. Ist ein Modul vorhanden und geladen, kann es beliebig oft im Skript verwendet werden.

Folgende Module / Erweiterungen sind derzeit verfügbar:

fileinto

Verschieben von Nachrichten in IMAP Ordner

envelope

E-Mail Envelope Einträge untersuchen (z.B. Sender und Empfänger)

encoded-character

Sonderzeichen numerisch kodieren

copy

Speichern weitergeleiteter Nachrichten

body

Den Body einer E-Mail untersuchen

variables

Variablen-Unterstützung von Sieve nutzen

relational

Bedingte Abfragen im Sieve Skript

imap4flag

Setzen von IMAP Flags in Nachrichten (z.B. als "gelesen" markieren)

subaddress

Prüfen von Subadress-Einträgen im Empfängerteil der Mail-Adresse

reject

Mails mit einer Nachricht abweisen

enotify

Senden von Benachrichtigungen

mailbox

Prüfen ob IMAP Folder existieren bzw. Anlegen neuer Folder

environment

Auslesen von Informationen über den Sieve Interpreter

date

Zeit- und Datums-Einträge abfragen

regex

Regular Expression Support von Sieve nutzen

editheader

Hinzufügen und Entfernen von Header Einträgen in Nachrichten

ihave

Sieve Module / Erweiterungen auf Support und Verwendung abfragen

include

Weitere Sieve Skripte inkludieren

Die erste Zeile eines Sieve Skriptes enthält dann require ["Modulname1", "Modulname2"] um die entsprechenden Erweiterungen verwenden zu können.

Weitere Informationen zu den Sieve Erweiterungen befinden sich im Dovecot Wiki.

Aufbau eines Sieve Skriptes

Anhand dieses einfachen Beispiels sollen der Aufbau und die Befehle von Sieve Skripten demonstriert werden:

require ["regex", "fileinto", "imap4flags", "mailbox"];

/*
   Suche nach der Zeichenkette "YES" im "X-Spam-Flag"-Header der Mail.
   Falls der Ausdruck gefunden wurde, lege die Mail im Folder "Spamverdacht" ab
   und markiere sie als gelesen.
*/

if allof (header :contains "X-Spam-Flag:" "YES") { 

    # Mail als "gelesen" markieren
    setflag "\\Seen";

    # In den IMAP Folder "Spamverdacht" verschieben
    fileinto "Spamverdacht";

    # Skriptausführung anhalten
    stop;
}

/*
   In der Zeile "Subject" des Mail-Headers nach dem Textbestandteil "Newsletter" suchen.
   Wenn gefunden, die Mail in den IMAP Folder "Newsletter" verschieben, falls dieser existiert.
*/
if header :contains "Subject" "Newsletter" {
    if mailboxexists "Newsletter" {
        fileinto "Newsletter";
        stop;
    } else {
        fileinto "INBOX";
        stop;
    }
}

Jedes Skript kann wie im Beispiel mit ein- oder mehrzeiligen Kommentaren versehen werden:

# Einzeiliger Kommentar, beginnend mit einem Hash (#)
/* Mehrzeiliger Kommentar, beginnend mit einem Slash (/), gefolgt von
einem Asterisk (*), endend mit einem Asterisk und Slash.*/

Die erste Zeile lädt mit "require" alle notwendigen Sieve-Erweiterungen zur Ausführung des Skriptes. Diese sind in diesem Beispiel "regex" zum Auswerten von regulären Ausdrücken, "fileinto" zum Speichern von E-Mails in IMAP-Ordnern, "imap4flags" zum Setzen der IMAP-Flags von Nachrichten und "mailbox", um die Existenz von IMAP-Ordnern abzufragen.

Mit einfachen oder auch verschachtelten Bedingungen können nun Nachrichten ausgewertet werden. Die erste Abfrage überprüft mit der Regex-Erweiterung, ob im Header der eintreffenden E-Mails das Wort "YES" in einer Zeile mit "X-Spam-Flag:" vorhanden ist. if leitet die Abfrage ein. Das allof bedeutet, dass alle Bedingungen der Abfrage erfüllt sein müssen.
Funktionen in einer Bedingung werden mit geschweiften Klammern { und } zusammengefasst. Nur Aktionen innerhalb dieser Klammern werden beim Zutreffen einer Bedingung in einer if-Abfrage ausgeführt. Aktionen müssen mit einem Semikolon (;) abgeschlossen werden.

Mit setflag "\\Seen"; wird die Nachricht als gelesen markiert. fileinto verschiebt die Nachricht in einen existierenden IMAP-Folder. Damit nach Erfüllung der Bedingung keine weiteren Abfragen mehr ausgeführt werden, wird die Skriptausführung mit einem stop; beendet.

Die stop;-Anweisung stoppt die weitere Ausführung des Sieve-Skriptes. Ohne ein Stop, würden alle folgenden Abfragen ausgeführt werden bis das Ende des Skriptes oder ein stop; erreicht wird. Dies ist dann nützlich, wenn viele verschiedene Abfragen nacheinander / unabhängig voneinander aufgerufen werden sollen.

Die Abfragen im zweiten Skript sind ein wenig komplexer. Zuerst wird geprüft, ob sich im in der Header-Zeile "Subject" das Wort "Newsletter" befindet. Danach kommt eine weitere verschachtelte Abfrage mit mailboxexists, ob der IMAP-Folder "Newsletter" existiert. Wenn ja, wird die Nachricht dort hinein verschoben. Existiert der Ordner nicht, wird mit else die Alternative ausgeführt. In diesem Fall landet die Nachricht dann in der INBOX. Die else-Anweisung ist überflüssig, da Nachrichten automatisch in der Inbox landen, wenn keine Sieve Regeln zutreffen. Sie dient hier nur zur Veranschaulichung.

Weitere Beispiele und Informationen zu Sieve befinden sich im deutschen Wikipedia Artikel sowie in der Tutorial-Sektion auf sieve.info.

Vergleich von Procmail und Sieve

Diese Beispiele zeigen die Umsetzung einiger Procmail-Skripte in einem äquivalenten Sieve-Skript.

Procmail

Sieve

Funktion

:0
* ^Subject:.*Dovecot.*
|/usr/local/bin/dmail +Dovecot

if header :contains "Subject" "[Dovecot]" {
        fileinto "Dovecot";
        stop;
}

Wenn sich im Betreff der Mail "[Dovecot]" befindet, wird die Nachricht in den IMAP Ordner "Dovecot" verschoben.

:0
* ^From: spam@addresse.de
/dev/null

if header :contains "From:" "spam@addresse.de" {
        discard;
        stop;
}

Wenn die Absenderadresse "spam@adresse.de" ist, wird die Nachricht verworfen.

:0:
* ^(From|Reply-To|Return-Path): .*@spamaddresse.de
|/usr/local/bin/dmail +Spamverdacht

if anyof (header :contains ["From", "Reply-To", "Return-Path"] "@spamaddresse.de")
{
        fileinto "Spamverdacht";
        stop;
}

Wenn die Absender-, die Antwort- oder Weg-Adresse "@spamaddresse.de" enthält, wird die Nachricht in den IMAP Ordner "Spamverdacht" verschoben.

Verwendung der Weboberfläche

Die Webmail Instanz des FB3 ist mit einem Plugin ausgestattet, welches eine Weboberfläche zum Verwalten und Editieren von eigenen Sieve-Skripten ermöglicht. Nach dem erfolgreichen Login ist die Filter-Verwaltung unter "Settings" und dort unter "Filters" zu erreichen.

sieve-01.jpg

Sieve Regeln grafisch anlegen

Filter erstellen

Beim ersten Aufrufen der Weboberfläche existieren noch keine Filter, sodass folgende Meldung erscheint:

sieve-02.jpg

Mit einem Klick auf die mit dem roten Pfeil markierte Schaltfläche "Use default filters" wird ein neues Regelset angelegt. Dieses ist leer und trägt den aktuellen Nutzernamen als Bezeichnung. Nun hat man die Möglichkeit eine neue Sieve-Regel aufzustellen. Dies geschieht mit dem Plus-Button ganz unten links in der mittleren Spalte.

sieve-03.jpg

Nun können ganz intuitiv Sieve-Regeln zum Filtern in der rechten Spalte auf der Seite angelegt werden. Hierzu wählt man zuerst einen Filternamen und definiert dann unter "Filter Rules" eine oder mehrere Bedingungen bei der die Regel angewendet werden soll. Die "Filter Actions" sind Aktionen die ausgeführt werden, wenn die Bedingung(en) zutrifft. Mit einem Klick auf "Save" wird die Regel gespeichert und erscheint dann in der mittleren Spalte, in der Filterliste.

sieve-04.jpg

Man kann nun noch weitere Filter hinzufügen, indem wieder auf den Plus-Button geklickt und dann ein weiterer Filter definiert wird.

Filtersets verwalten

Sieve-Filter werden in Sets zusammengefasst. Jedes Set beinhaltet die wie oben beschriebenen Filter. Wer unter bestimmten Bedingungen völlig andere Sieve Regeln benötigt, braucht nicht jedes Mal neue Filter anzulegen und alte zu löschen. Stattdessen kann einfach ein weiteres Set angelegt und aktiviert werden. Mit einem Klick auf das Zahnradsymbol am unteren Rand der mittleren Spalte werden neben diversen Optionen auch alle Skript-Sets angezeigt.

sieve-05.jpg

Das derzeit ausgewählte Regelset, welches bearbeitet wird, erscheint fett geschrieben in der Liste. Zum wechseln der Sets muss einfach auf den entsprechenden Namen geklickt werden. Damit ein Sieve Skript aktiv wird, muss "Activate this ruleset" auf den Skript angewendet werden! Ansonsten wird der Skript nicht ausgeführt. Es kann zur Zeit immer nur ein Regelset aktiv sein. Das derzeit aktiviere Regelset ist in der Liste mit einem (active) hinter dem Namen gekennzeichnet.

Ist ein Set ausgewählt, kann es mit "Delete this ruleset" gelöscht und mit "Rename this ruleset" umbenannt werden. Mit "Create a new ruleset" wird ein neuer Satz Sieve-Filter angelegt. Nach Eingabe des Set-Namens kann mit der Bearbeitung neuer Filter begonnen werden.

Sieve Skripte selbst schreiben

Nutzer die ihre Sieve-Skripte selbst schreiben möchten nutzen bitte den Modus "Advanced Editor". Das Anlegen der Regel-Sets erfolgt wie beim grafischen Anlegen der Sieve-Skripte. Die Regeln werden nun allerdings selbst geschrieben und können im Nachhinein unter Umständen nicht mehr vom grafischen Editiermodus ausgelesen werden.

sieve-06.jpg

Vor dem Wechseln zum "Advanced Editor" wird nochmals darauf hingewiesen, dass selbst geschriebene Sieve Regeln vom grafischen Editiermodus nicht ausgelesen werden könnten. Dies muss bestätigt werden.

sieve-07.jpg

Ein im "Advanced Editor" geschriebener Sieve-Skript sollte nur von diesem bearbeitet werden, es könnten Informationen verloren gehen, wenn versucht wird den Skript mit der grafischen Lösung zu speichern! Es empfiehlt sich das Anlegen eines neuen, leeren Regel-Sets, wenn doch der grafische Editiermodus genutzt werden soll.

Das "Advaned Editor" stellt ein Textfeld bereit, in dem Sieve-Skripte direkt editiert oder hineinkopiert werden können. Mit einem Klick auf "Save" wird die Änderung gespeichert.

sieve-08.jpg

Das Plugin wird beim Speichern versuchen, das Sieve Skript zu kompilieren und ein entsprechendes Feedback geben. Erscheint die Meldung:

"test" ACTIVE
OK "Listscripts completed."

... wurde der Skript erfolgreich kompiliert und ist fehlerfrei.

Erscheint allerdings folgende Meldung:

sieve-09.jpg

... ist das Sieve-Skript fehlerhaft und sollte noch einmal überprüft werden. Es wird empfohlen die Sieve Skripte außerhalb des Textfeldes zu erstellen und in das Formular zu kopieren um Informationsverlust ausschließen zu können.

Nach dem Speichern des eigenen Skriptes bitte nochmals überprüfen ob dieses auch aktiv ist. Siehe https://www.informatik.uni-bremen.de/t/Sieve#Filtersets_verwalten.

Eigenen ManageSieve Client nutzen

Wer anstatt der Weboberfläche lieber einen eigenen ManageSieve Client verwenden möchte benötigt folgende Daten:

Verbindungsdaten

Server: imap.informatik.uni-bremen.de
Port: 4190
Verschlüsselung: Ja (SSL)
Benutzername und Passwort des FB3-Accounts zur Authentifizierung verwenden!

Konfigurationsbeispiel

Als Beispiel ist die Konfiguration des Thunderbird Plugins "Sieve" hier dokumentiert.

Sieve (zuletzt geändert am 2013-03-07 12:46:10 durch jbrandt)