Revision 3 vom 2013-02-19 12:02:48

Nachricht löschen

Sieve

Die Sieve Filtersprache ermöglicht das Erstellen von Mailfiltern auf dem neuen Mailsystems des FB3, mit Hilfe von Skripten, die nach einem einfachen Prinzip aufgebaut sind. Dieser Tutorial soll für diejenigen, die das Webinterface des Webmailer nicht verwenden möchten, einen kleinen Einblick in die Filtersprache geben.

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. Erweiterung geladen werden. Dies 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

Speichern von Nachrichten in IMAP Ordner

envelope

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

encoded-character

Spezielle Zeichen numerisch enkodieren

copy

Speichern weitergeleiteter Nachrichten

body

Den Body einer E-Mail untersuchen

variables

Variablen Unterstützung von Sieve nutzen

vacation

Automatische E-Mail Antwort bei Abwesenheit

vacation-seconds

Vacation Erweiterung zum erneuten Senden von Vacation Nachrichten nach Sekunden und nicht nach Tagen

relational

Relationale Abfragen im Sieve Skript

imap4flag

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

subaddress

Prüfen von Einträgen im local-part der Adresse

reject

Mails mit einer Nachricht abweisen

enotify

Senden von Notifications

mailbox

Preufen ob IMAP Folder existieren und Anlegen neuer

environment

Testen von Werten mit dem Environment der Ausführung

date

Zeit- und Datums-Einträge abfragen

regex

Regular Expression support von Sieve nutzen

editheader

Hinzufügen und Entfernen und 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 von diesem Beispiel-Skript soll der Aufbau und die Befehle von Sieve Skripten gezeigt werden:

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

/*
   Suche nach "YES" im Header der Mail in der Zeile mit "X-Spam-Flag" und lege Mail
   im Spam-Verzeichnis ab, wenn Eintrag gefunden wurde.
*/

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

    setflag "\\Seen";

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

   # Skriptausführung anhalten
    stop;
 }

# In der Zeile "Subject" des Mail-Headers nach "Newsletter" suchen. Wenn gefunden,
# Mail in den IMAP Ordner "Newsletter", wenn dieser existiert.

if header :contains "Subject" "Newsletter" {
    if mailboxexists "Newsletter" {
        fileinto "Newsletter";
        stop;
    } else {
        fileinto "INBOX";
        stop;
    }
}

Jeder 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 des Skriptes lädt mit "require" alle notwendigen Sieve-Erweiterungen zur Ausführung des Skriptes. Diese sind in diesem Beispiel "regex" zum Einsatz von regulären Ausdrücken, "fileinto" zum Speichern von E-Mails in IMAP Ordnern, "imap4flags" zum Setzen von IMAP Flags bei Nachrichten und "mailbox" um Existenz von IMAP Ordnern abzufragen.

Mit einfachen, aber 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 "}" zusammen gefasst. Nur Aktionen innerhalb dieser Klammern werden beim Zutreffen einer Bedingung in einer if-Abfrage ausgeführt. Funktionen müssen mit einem Semikolon ";" abgeschlossen werden.

Mit setflag "\\Seen"; wird die Nachricht als gelesen markiert. "fileinto" verschiebt die Nachricht in einen vorhandenen IMAP-Ordner. Damit keine weiteren Abfragen mehr ausgeführt werden, wenn die Bedingung erfüllt ist, 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 zweite Abfrage im Skript ist ein wenig komplexer. Zuerst wird geprüft, ob sich im Header in der Subject-Zeile der Nachricht das Wort "Newsletter" befindet. Danach kommt eine weitere, verschachtelte Abfrage, wenn "Newsletter" im Betreff vorhanden ist. Sie prüft mit mailboxexists ob der IMAP Ordner "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 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 ziegen die Umsetzung einiger Procmail Skripte in einen äquivalenten Sieve-Skript.

Procmail

Sieve

Funnktion

: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.