Sieve Filterregeln

Zuletzt geändert von Aysegül Omus am 2024/04/05 12:56

1. Syntax

1.1. Vergleiche

Sieve kennt insgesamt 6 Vergleiche, davon 3 String Vergleiche (Text) und 3 Integer Vergleiche (Zahlen).

String Vergleiche:

  • :is bedeutet, dass der Inhalt des verglichenen Feldes dem angegebenen Wert exakt gleichen muss.
  • :contains bewirkt, dass die Bedingung erfüllt ist, wenn das Schlüsselwort im verglichenen Feld enthalten ist.
  • :matches bedeutet, dass das verglichene Feld dem angegebenen Wildcard Ausdruck entsprechen muss, also mit '?' (exakt ein Charakter) und '*' (0 bis unendlich viele Charaktere). Um normale '?' und '' müssen Sie "\\?" und "\\*" schreiben.

Integer Vergleiche:

  • :over bedeutet, dass der Wert des Feldes über dem angegebenen liegen muss.
  • :under bedeutet, dass der Wert des Feldes unter dem angegebenen liegen muss.
  • :count zählt die Anzahl der Werte im angegebenen Feld.

Zusätzlich kann noch geprüft werden, ob ein bestimmtes Feld im Header vorhanden ist:

  • :exists prüft, ob ein Feld im Header gesetzt ist und ist besonders sinnvoll in Kombination mit dem "not" Operator z.B. um zu testen, ob ein Betreff gesetzt ist.

1.2. Kontrollstrukturen und Blöcke

Um Fallunterscheidungen zu treffen versteht Sieve die üblichen if, else, elsif Strukturen:

  • if bedeutet, dass die im darauffolgenden Block festgelegten Aktionen ausgeführt werden, wenn die angegebene Bedingung erfüllt ist.
  • else kann nach einer "if" Struktur stehen und die im darauffolgenden Block festgelegten Aktionen werden ausgeführt, wenn die Bedingung der vorangehenden if-Struktur nicht erfüllt ist.
  • elsif kombiniert eine "else" - mit einer "if" Struktur und ist wie eine \"if\" Struktur in einem "else" Block zu verstehen.
  • allof ( ... ) stellt eine Verknüpfung mehrerer Bedingungen dar und ist dann erfüllt, wenn alle \"Unterbedingungen\" erfüllt sind (Und-Verknüpfung). Diese werden als durch Kommata getrennte Liste in den Klammern angegeben.
  • anyof ( ... ) stellt eine Verknüpfung mehrerer Bedingungen dar und ist dann erfüllt, wenn mindestens eine "Unterbedingung" erfüllt sind (Oder-Verknüpfung). Diese werden als durch Kommata getrennte Liste in den Klammern angegeben.
  • not ... negiert die darauffolgende Bedingung.
  • [ ... ] dient zur Auflistung von Elementen, z.B. einer String-Liste: ["Max", "Martin", "Manuel"] .
  • { ... } dient zur Abgrenzung eines Aktionsblocks.

1.3. Felder

Folgende Felder stehen für Vergleiche zur Verfügung:

  • :header Dieses Feld ist wohl das vielfältigste, da es Zugriff auf sämtliche Header-Felder ermöglicht. Benötigt keine "require" Anweisung.
  • :address Dieses Feld gibt direkten Zugriff auf alle Adress-Felder des Headers. Es Unterstützt mindestens die From, To, Cc, Bcc, Sender, Resent-From, Resent-To Felder und implementierungsabhängig eventuell auch weitere. Benötigt keine "require" Anweisung.
  • :size Dieses Feld ermöglicht einen Vergleich der Größe der E-Mail. Benötigt keine "require" Anweisung.

1.4. Aktionen

 stop; dient zum Beenden der Ausführung des Skripts. Benötigt keine "require" Anweisung.

  • reject " ... "; bewirkt, dass die E-Mail an den Absender zurückgesendet wird. Zwischen den Anführungszeichen kann eine Nachricht eingetragen werden, die dieser Bekommt, z.B. der Grund für die Ablehnung. Benötigt keine "require" Anweisung, diese wird jedoch empfohlen.
  • discard; bewirkt, dass die E-Mail unwiderruflich gelöscht wird, ohne den Absender zu informieren. Benötigt keine "require" Anweisung, diese wird jedoch empfohlen.
  • keep; bewirkt, dass die E-Mail im Standard-Ordner gespeichert wird. Überschreibt eine eventuell vorangehende discard Aktion. Benötigt keine "require" Anweisung.
  • fileinto " ... "; bewirkt, dass die E-Mail im angegebenen Ordner gespeichert wird. Zwischen die Anführungszeichen wird der Ordnername eingetragen. Falls der Ordner nicht existiert, wird die Nachricht im Standard-Ordner gespeichert und es werden keine weiteren Aktionen ausgeführt. Benötigt eine "require" Anweisung.
  • redirect " ... "; bewirkt, dass die E-Mail umgeleitet wird. Die Zieladresse wird in Anführungszeichen angegeben. Benötigt keine "require" Anweisung, diese wird jedoch empfohlen.

1.5. Diverses

Einzeilige Kommentare werden mit einem '#' eingeleitet. Mehrzeilige Kommentare werden mit "/*"  begonnen und mit "*/" beendet.

Einige Funktionen müssen zu Beginn des Skripts noch explizit eingebunden werden. Das geht mit einer require Anweisung.

Beispiel:

require ["fileinto", "reject"];

2. Beispiele

2.1. Einfache Beispiele

Das folgende Beispiel sortiert alle E-Mails von einer der 3 angegebenen Adressen in der Ordner "freunde" ein:

if address :is :all "**From**" ["bob@example.com", "alice@example2.com", "bff@somewhere.de"] {
   fileinto "INBOX.freunde";
}

Dieses Beispiel zeigt die Nutzung einer "if" Struktur, des "address" Feldes, eines exakten Vergleichs mittels ":is" und einer Liste in "[ ... ]", sowie der "fileinto" Aktion.

Es ist auch möglich im Betreff nach Schlüsselwörtern zu suchen:

if header :contains "subject" "Facebook" {
   discard;
}

Diese Regel hat zur Folge, dass alle E-Mails, deren Betreff das Schlüsselwort \"Facebook\" enthalten einfach gelöscht werden, da sie definitiv Spam sind.

Das folgende Beispiel lehnt E-Mails ab, die größer als 1MB sind:

if size :over 1M {
   reject "Bitte sehen Sie davon ab, mir E-Mails mit großen Anhängen zu senden, da mein Mail-Speicher begrenzt ist.";
}

2.2. Verschieben von Spam-Mails in einen eigenen Ordner

if header :contains "X-Spam-Level" "*******" {
     # Wenn der Spam als gelesen markiert werden soll:
     # addflag "\\Seen";

    fileinto "INBOX.Junk";
}

2.3. Ignorieren bestimmter E-Mails

if address "From" "virusalert@informatik.tu-muenchen.de" {
    discard;
}

2.4. Weiterleiten oder Verschieben nach Betreff

if header :contains "subject" "my_project" {
    # Zum Verschieben in einen Ordner
    # fileinto "INBOX.project";

    # Zum Weiterleiten mit lokaler Kopie
   redirect :copy "me@example.com";

    # Zum Weiterleiten ohne lokale Kopie
    # redirect "me@example.com";
}

Zu weiteren Informationen bezüglich Weiterleitungen, lesen Sie bitte hier nach.

2.5. Sortieren nach Adress-Zusätzen

require ["mailbox"];

if envelope :matches "to" "*+abc@*" {
    # Legt den entsprechenden Ordner automatisch an, sofern er noch nicht existiert und verschiebt, die E-Mail, die an *+abc@* kommen dorthin.
   fileinto :create "INBOX.abc";
}