Sieve
Sieve - Sprache zur Konfiguration von Mailfiltern auf Mailservern durch Benutzer
Beschreibung
Sieve ist eine domänenspezifische Sprache, die zum Konfigurieren von Mailfiltern auf Mailservern durch Benutzer konzipiert wurde.
- Die genaue Spezifikation kann im RFC 5228 nachgelesen werden.
Sieve ist spezifiziert worden, um Nutzern die Möglichkeit zu geben, auf einfache Art eigene Regeln zum Filtern von E-Mails zu definieren.
- Dabei ist es jedoch nicht möglich, komplexere Programmstrukturen, die beispielsweise mit Schleifen oder Variablen arbeiten, zu benutzen oder externe Programme zu starten.
- Das Hauptaugenmerk von Sieve liegt auf Erweiterbarkeit, Einfachheit und Unabhängigkeit von der verwendeten Zugriffsart und Architektur und dem verwendeten Betriebssystem.
- Sieve-Scripts werden bereits während der Zustellung der E-Mail am Posteingangsserver ausgeführt.
- Verbreitung
Sieve-Skripte werden von vielen Mailservern und E-Mail-Clients direkt oder über Plugins unterstützt.
[1][2] Darüber hinaus gibt es Libraries zum Parsen von Sieve-Skripten für die Programmiersprachen C, Ruby, Java, PHP, Perl und Python.[3]
Anwendung
# Beispielskript
#
require ["fileinto", "reject"];
# Nachrichten größer 100K werden abgewiesen mit einer Fehlermeldung
#
if size :over 100K {
reject "Bitte senden Sie mir das nächste Mal eine kleinere Mail.
* Bei großen Anhängen laden Sie bitte die Dateien auf einen Server und schicken Sie mir eine URL.
* Danke.";
}
# Eine Mailingliste soll in einen Ordner "mailinglist" verschoben werden
#
elsif address :is ["From", "To"] "mailinglist@example.com" {
fileinto "INBOX.mailinglist";
# Bei einigen Mailserver-Konfigurationen muss statt eines Punktes hierbei ein Schrägstrich verwendet werden.
}
# Spamregel: Nachricht enthält meine Adresse nicht im To, CC oder Bcc
# header, oder Subject ist irgendwas mit "money" beziehungsweise "Viagra".
#
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "me@example.com",
header :matches "Subject" ["*money*","*Viagra*"]) {
fileinto "INBOX.spam";
}
# Alle anderen Mails behalten wir.
# Diese Regel wäre nicht nötig, da durch das "implicit keep"
# bereits abgedeckt.
else {
keep;
}
Syntax
- Anweisungen werden mit dem Semikolon abgeschlossen
Kommentare
Kommentare werden durch das Zeichen "#" eingeleitet.
- Diese Kommentare gelten immer bis zum Zeilenende.
- Mehrzeilige Kommentare werden wie in C mit dem String "/*" eingeleitet und mit dem String "*/" abgeschlossen.
Zahlen
Nur positive Ganzzahlen sind erlaubt.
- Optional gibt es die Möglichkeit, die Größe über Angaben wie "K" (KiB, 2^10), "M" (MiB, 2^20) und "G" (GiB, 2^30) anzugeben.
- Beispiel: 100K steht für eine Größe von 100 Kibibytes.
Strings
Strings (Zeichenketten) werden durch das Anführungszeichen " eingeleitet.
- Ein Backslash ("\") wird verwendet, um weitere Anführungszeichen oder Backslashes zu kennzeichnen, die noch zur aktuellen Zeichenkette gehören (sogenanntes "Escapen").
- String-Listen werden mit "[" eingeleitet und mit "]" abgeschlossen.
Kontrollstrukturen
Die wichtigste Anwendung beim Filtern von E-Mail besteht im Testen auf bestimmte Eigenschaften. Dazu gibt es auch in Sieve die wohlbekannten WENN-DANN-Möglichkeiten:
- if
- elsif
- else
Ein if leitet eine bedingte Anweisung ein.
- Nur wenn die zu testende Bedingung zutrifft, wird der nachfolgende Codeblock ausgeführt.
- Wenn nicht, dann können weitere Bedingungen mittels elsif abgefragt werden.
- Falls keine der Bedingungen aus den "if"- und "elsif"-Blöcken zutrifft, werden die Anweisungen des "else"-Blocks abgearbeitet, sofern er vorhanden ist.
Vergleiche von Zeichenketten
Es bestehen mehrere Möglichkeiten, einen String zu testen.
- Als Vergleichsoperatoren kommen hierbei zum Einsatz:
- contains
- prüft, ob eine bestimmte Zeichenkette in einem anderen String enthalten ist.
- is
- führt einen exakten Vergleich durch, d. h.
- die Inhalte der verglichenen Zeichenketten müssen exakt übereinstimmen.
- matches
- beinhaltet eine Möglichkeit, beim Vergleich Teile einer Zeichenkette ungeprüft zu belassen.
- Mit dem Symbol * können mehrere, mit dem Symbol ? genau ein Zeichen freigestellt werden.
- So wird beispielsweise G?n alle dreibuchstabigen Wörter mit einem großen G am Anfang und einem kleinen n am Ende finden, während G*n alle Wörter von Gin über Gasmann bis hin zu Gesundheitskartenevaluierungskommission und darüber hinaus adressieren wird.
Adressen-Matching
E-Mail-Adressen prüft man mit dem Keyword address.
- Natürlich ist es möglich, die Absender- oder die Empfängeradresse zu prüfen.
- Dabei wird generell nur auf die eigentliche Adresse verglichen, also alles was zwischen den spitzen Klammern geschrieben steht.
- Um den kompletten String zu vergleichen, sollte man auf Name "<" Adresse ">" prüfen.
- Die Anführungszeichen kennzeichnen hierbei Strings.
- Um Adressen auf den Teil vor dem @ oder nach dem @ zu prüfen, können die optionalen Argumente :localpart beziehungsweise :domain genutzt werden.
- Standardmäßig wird die komplette Adresse geprüft (entspricht :all).
Größenvergleiche
Die Größe einer Mail prüft man mit dem Keyword size.
- Vergleiche mit Zahlen kann man mit den Operatoren :over beziehungsweise :under durchführen.
Header-Felder
E-Mail Header können mit dem Keyword header geprüft werden.
- Header-Felder können ganz normal mit den oben beschriebenen Zeichenketten-Vergleichen durchsucht werden.
- Es ist darauf zu achten, dass der Doppelpunkt nicht verwendet wird.
Blöcke
Blockanweisungen werden durch { eingeleitet und mit } beendet.
- Blöcke werden genutzt, um nach einem Test mehrere Anweisungen durchzuführen.
Anweisungen
Option | Beschreibung |
---|---|
stop | Beendet die Ausführung. Falls keine Regel zugetroffen hat, wird die Nachricht in der INBOX belassen (Impliziertes keep) |
keep | Speichert die Nachricht in der INBOX |
redirect | Weiterleiten einer Nachricht. Als Argument wird eine E-Mail-Adresse angegeben. |
discard | Löscht die Nachricht. Der Absender erhält davon keine Nachricht. |
reject | Diese Anweisung sorgt dafür, dass die Nachricht abgelehnt wird.
|
fileinto | Die Nachricht kann in einen bestimmten Ordner verschoben werden.
|
Erweiterungen
Sieve gestattet auch zusätzliche Erweiterungen, die am Anfang des Skriptes mit dem Schlüsselwort require deklariert werden müssen.
Anhang
Siehe auch
Dokumentation
Links
Projekt
Weblinks
- https://github.com/thsmi/sieve/
- https://wiki.ubuntuusers.de/Archiv/sieve/
- offizielle Website
- c't-Special Linux Mailserver mit Spamfilter
- RFC 3028 Sieve: A Mail Filtering Language
- kommentierte Beispiele
- RFC 5228
- https://de.wikipedia.org/wiki/Sieve