= 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 [[https://www.informatik.uni-bremen.de/t/Sieve#Sieve_Regeln_grafisch_anlegen|Webinterface]] verwendet werden. Selbst geschriebene Skripte können damit [[https://www.informatik.uni-bremen.de/t/Sieve#Sieve_Skripte_selbst_schreiben|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:''' ||[[http://tools.ietf.org/html/rfc5228#section-4.1|fileinto]] ||Verschieben von Nachrichten in IMAP Ordner|| ||[[http://tools.ietf.org/html/rfc5228#section-5.4|envelope]] ||E-Mail Envelope Einträge untersuchen (z.B. Sender und Empfänger)|| ||[[http://tools.ietf.org/html/rfc5228#section-2.4.2.4|encoded-character]] ||Sonderzeichen numerisch kodieren|| ||[[http://tools.ietf.org/html/rfc3894/|copy]] ||Speichern weitergeleiteter Nachrichten|| ||[[http://tools.ietf.org/html/rfc5173/|body]] ||Den Body einer E-Mail untersuchen|| ||[[http://tools.ietf.org/html/rfc5229/|variables]] ||Variablen-Unterstützung von Sieve nutzen|| ||[[http://tools.ietf.org/html/rfc5231/|relational]] ||Bedingte Abfragen im Sieve Skript|| ||[[http://tools.ietf.org/html/rfc5232/|imap4flag]] ||Setzen von IMAP Flags in Nachrichten (z.B. als "gelesen" markieren)|| ||[[http://tools.ietf.org/html/rfc5233/|subaddress]] ||Prüfen von Subadress-Einträgen im Empfängerteil der Mail-Adresse|| ||[[http://tools.ietf.org/html/rfc5429#section-2.2|reject]] ||Mails mit einer Nachricht abweisen|| ||[[http://tools.ietf.org/html/rfc5435/|enotify]] ||Senden von Benachrichtigungen|| ||[[http://tools.ietf.org/html/rfc5490#section-3|mailbox]] ||Prüfen ob IMAP Folder existieren bzw. Anlegen neuer Folder|| ||[[http://tools.ietf.org/html/rfc5183/|environment]] ||Auslesen von Informationen über den Sieve Interpreter|| ||[[http://tools.ietf.org/html/rfc5260#section-4|date]] ||Zeit- und Datums-Einträge abfragen|| ||[[http://tools.ietf.org/html/draft-murchison-sieve-regex-08/|regex]] ||Regular Expression Support von Sieve nutzen|| ||[[http://tools.ietf.org/html/rfc5293/|editheader]] ||Hinzufügen und Entfernen von Header Einträgen in Nachrichten|| ||[[http://tools.ietf.org/html/rfc5463/|ihave]] ||Sieve Module / Erweiterungen auf Support und Verwendung abfragen|| ||[[http://tools.ietf.org/html/rfc6609/|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 [[http://wiki2.dovecot.org/Pigeonhole/Sieve|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 [[http://de.wikipedia.org/wiki/Sieve|deutschen Wikipedia Artikel]] sowie in der Tutorial-Sektion auf [[http://sieve.info/tutorials|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 [[https://webmail.informatik.uni-bremen.de/|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. {{attachment:sieve-01.jpg}} == Sieve Regeln grafisch anlegen == === Filter erstellen === Beim ersten Aufrufen der Weboberfläche existieren noch keine Filter, sodass folgende Meldung erscheint: {{attachment: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. {{attachment: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. {{attachment: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. {{attachment: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'''. {{attachment: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. {{attachment: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. {{attachment: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: {{attachment: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||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" [[Thunderbird Sieve Plugin|hier dokumentiert]].