Mit SIEVE können Emails serverseitig auf IMAP-Servern verarbeitet werden. Mit der sieveshell können die Skripte auf den Server geladen werden. Es kann immer nur ein Skript aktiviert sein.
sieveshell –user=hdab –a hdab localhost
put myscript.sieve
activate myscript.sieveSyntax
Kommentare
Kommentarzeilen beginnen mit “#”.
Zahlen
Nur positive Ganzzahlen sind erlaubt. Größen können über “K” , “M” und “G” für Kilobytes, Megabytes und Gigabytes angegeben werden.
Strings
Strings werden durch " eingeleitet. Das Escapezeichen ist . String-Listen werden mit “[” eingeleitet und mit “]” abgeschlossen.
Kontrollstrukturen
Sieve ermöglicht Wenn-Dann Konstrukte mit:
- 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 vorhanden.
Vergleiche von Zeichenketten
Es bestehen mehrere Vergleichsoperationen für Strings:
- :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 mit dem Keyword address geprüft werden. 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 bzw. :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 bzw. :under durchführen. Header-Felder 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 Um nach einem Test mehrere Anweisungen auszuführen können Blöcke mit {} gebildet werden. Anweisungen Wenn eine Regel matcht können folgende Anweisungen ausgeführt werden:
- 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. Optional kann man einen Grund für die Ablehnung angeben. Es wird eine sogenannte “Message Delivery Notification” erstellt. Falls man “reject” nutzen will, muss man dies über den “require reject” am Anfang des Scriptes anfordern.
- fileinto Die Nachricht kann in einen bestimmten Ordner verschoben werden. Dazu muss als Argument der Folder in der für den Server spezifischen Form angegeben werden. Will man “fileinto” nutzen, muss man es als erstes über den “require” anfordern.
Beispielskript
require ["fileinto", "reject"];
# Nachrichten größer 100K werden abgewiesen mit einer Fehlermeldung
#
if size :over 100K {
reject "Die Datei war groesser als 100k. Bitte kleinere Datein schicken.";
}
# Ein Mailing von vonboguszewski.name soll in einen Ordner verschoben # werden
#
elsif address :is ["From", "To"] "mailinglist@vonboguszewski.name" {
fileinto "INBOX.vonboguszewski";
}
# Spam Regel: Nachricht enthält meine Adresse nicht im To, CC oder Bcc
# header, oder Subject ist irgendwas mit "money" bzw. "Viagra".
#
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "me@blafasel.invalid",
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;
}