====== Sieve Syntax ====== Der Syntax wird grundlegend im [[https://tools.ietf.org/html/rfc5228 | RFC5228]] erklärt. Sieve kann mit Extentions erweitert werden. Die Seite mit den [[https://wiki2.dovecot.org/Pigeonhole/Sieve | von Dovecot unterstützten Extentions]] und die [[https://www.iana.org/assignments/sieve-extensions/sieve-extensions.xhtml | Übersicht von IANA]] verlinken zu den entsprechenden RFCs. Grob vereinfacht ist der Code folgender Maßen strukturiert: require ["extension1", "extension2"]; if <:match_type> <:optional_argument> { action1; action2; ... } ===== Comments ===== # comment line /* comment block over several lines like in C */ Der Editor unseres Webmails nutzt Kommentare um den einzelnen Regeln Namen zu geben # rule:[rule name] if { action; } ===== Control Commands ===== Wie in anderen Sprachen kann man mit //if// Fallunterscheidungen durchführen. Sieve geht bis zum Ende jede If-Regel durch und wendet jede zutreffende Regel an. Um ungewollte Dopperlverarbeitungen zu verhindern kann man //elseif// oder das //stop// Kommando verwenden. Letzteres beendet die weitere Verarbeitung der Sieve-Regeln. if { action; action; } elsif { action; action; } else { action; } # stops the script at this very position if { action; stop; } ===== String List ===== Mit Hilfe der String-Liste können alternative Werte, also mit OR verbunden, angegeben werden. ["string1", "string2"] ===== Logic Tests===== AND, OR und Negation werden von Sieve als Tests betrachtet, die man mit den anderen Tests kombinieren kann. //allof// (AND), //anyof// (OR) und //not// (Negation) lauten diese Tests. Bei //anyof// und //allof// müssen die Tests von runden Klammern umschlossen und durch Kommas getrennt werden. Dies wird Testliste genannt. if anyof ( test1, test2, test3 ) { action1; action2; } ===== Tests ===== Dies ist nur ein Ausschnitt mit den gebräuchlichsten Tests. Die Sieve-Extentions bieten [[https://wiki2.dovecot.org/Pigeonhole/Sieve | weitere Tests]]. ==== header ==== testet einen beliebig definierbaren header require ["fileinto", "other_extension"]; # Move mails with a Spamassassin score of 6.0 or more into the "Junk" folder. if header :contains "x-spam-level" "******" { fileinto "Junk"; } ==== address ==== testet nur headers mit Adressfeldern (From: To: Sender:) Im Gegensatz zum Test "header" kann man mit Hilfe von optionalen Argumenten auch nach dem lokalen Teil oder der Domäne gesucht werden. Die optionalen Argumente lauten //:domain//, //:localpart// und //:all// . if address :is :domain "to" "example.com" { action; } ==== envelope ==== testet die Envelope header (MAIL FROM: und RCPT TO:) und nutzt genau wie der Test "address" die optionalen Argumente //:domain//, //:localpart// oder //:all//. "envelope" ist bereits ein Test, welcher mit der gleichnamigen Extension "envelope" geladen werden muss. Dazu muss in der ersten Zeile des Scripts mit require diese Erweiterung geladen werden. require ["envelope", "other_extension"]; ==== exists ==== testet ob ein spezieller header vorkommt. ==== size ==== ermöglicht Filter anhand der Mailgröße zu setzen. Die zugehörigen Argumente sind //:over// und //:under// if size :over 500K{ action; } ===== Match Types ===== ==== Exact Match ==== //:is// führt einen exakten Vergleich durch, Das heisst, die Zeichenkette muss mit dem String exakt übereinstimmen ==== Substring Match ==== //:contains// prüft, ob eine bestimmte Zeichenkette in einem String enthalten ist. ==== Wildcard Match ==== //:matches// kann beim Vergleich Teile einer Zeichenkette ungeprüft belassen. Mit dem Symbol "*" können mehrere, mit dem Symbol "?" genau ein Zeichen freigestellt werden. ==== body Raw Directive ==== //:raw// ist ein spezieller Match-Type des Tests "body" und liefert den body der Email als unveränderten Text. ==== body Text Directive ==== //:text// ist ein spezieller Match-Type des Tests "body" und säubert den body z.B. von HTML-Kommentaren. ===== Command Block ===== Der Command Block wird mit geschweiften Klammern umrahmt und jedes Kommando wird mit einem Strichpunkt abgeschlossen. Folgende Standardaktionen sind möglich, weitere Aktionen kann man per [[https://wiki2.dovecot.org/Pigeonhole/Sieve | Extensions]] laden. ==== keep ==== bedeutet, dass die Nachricht im Hauptmailboxordner, also der Inbox abgespeichert werden soll. Sieve hat immer ein "implizites keep" damit Emails, die auf keinen Filter ansprechen auf alle Fälle in der Inbox landen. ==== redirect ==== führt ein Forward zu einer anderen Adresse durch. Ein entsprechendes redirect ohne if-Abfrage kann zur generellen Weiterleitung aller Emails genutzt werden. redirect "user@sbg.ac.at"; ==== discard ==== verwirft die Email still und leise. ==== fileinto ==== verschiebt die Email in den gewünschten Mailbox-Ordner. Bei uns ist der Separator für (Sub)Folder ein "/", wie er auch unter Linux in Pfadangaben genutzt wird. Die Aktion "fileinto" ist im RFC nur empfohlen und wird daher als Extention in der ersten Zeile des Scripts geladen. require "fileinto"; if address :is :all ["from"] "user@sbg.ac.at" { fileinto "INBOX/mySpecialFriends"; } :!: Sollte der Ordner noch nicht existieren, wird bei unserem Dovecot Pigeonhole einfach der Ordner erstellt. ======= Beispiele ======= * [[https://wiki2.dovecot.org/Pigeonhole/Sieve/Examples]] * [[https://support.tigertech.net/sieve#sieve-example-rules-jmp]] * [[https://en.wikipedia.org/wiki/Sieve_%28mail_filtering_language%29#Example]] * [[https://www.fastmail.com/help/technical/sieve-examples.html]]