Wiki-Quellcode von Sieve Filterregeln
Zuletzt geändert von Aysegül Omus am 2024/04/05 12:56
Zeige letzte Bearbeiter
author | version | line-number | content |
---|---|---|---|
1 | = = | ||
2 | |||
3 | {{toc/}} | ||
4 | |||
5 | |||
6 | |||
7 | == 1. Syntax == | ||
8 | |||
9 | === 1.1. Vergleiche === | ||
10 | |||
11 | Sieve kennt insgesamt 6 Vergleiche, davon 3 String Vergleiche (Text) und 3 Integer Vergleiche (Zahlen). | ||
12 | |||
13 | String Vergleiche: | ||
14 | |||
15 | * **:is** bedeutet, dass der Inhalt des verglichenen Feldes dem angegebenen Wert **exakt gleichen** muss. | ||
16 | * **:contains** bewirkt, dass die Bedingung erfüllt ist, wenn das **Schlüsselwort** im verglichenen Feld **enthalten** ist. | ||
17 | * **: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. | ||
18 | |||
19 | Integer Vergleiche: | ||
20 | |||
21 | * **:over** bedeutet, dass der Wert des Feldes **über** dem angegebenen liegen muss. | ||
22 | * **:under** bedeutet, dass der Wert des Feldes **unter** dem angegebenen liegen muss. | ||
23 | * **:count** zählt die **Anzahl der Werte** im angegebenen Feld. | ||
24 | |||
25 | Zusätzlich kann noch geprüft werden, ob ein bestimmtes Feld im Header vorhanden ist: | ||
26 | |||
27 | * **: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. | ||
28 | |||
29 | === 1.2. Kontrollstrukturen und Blöcke === | ||
30 | |||
31 | Um Fallunterscheidungen zu treffen versteht Sieve die üblichen **if**, **else**, **elsif** Strukturen: | ||
32 | |||
33 | * **if** bedeutet, dass die im darauffolgenden Block festgelegten Aktionen ausgeführt werden, wenn die angegebene Bedingung erfüllt ist. | ||
34 | * **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. | ||
35 | * **elsif** kombiniert eine //"else"// - mit einer //"if"// Struktur und ist wie eine //\"if\"// Struktur in einem //"else"// Block zu verstehen. | ||
36 | * **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. | ||
37 | * **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. | ||
38 | * **not ...** negiert die darauffolgende Bedingung. | ||
39 | * **[ ... ]** dient zur **Auflistung von Elementen**, z.B. einer String-Liste: ["Max", "Martin", "Manuel"] . | ||
40 | * **{ ... }** dient zur Abgrenzung eines **Aktionsblocks**. | ||
41 | |||
42 | === 1.3. Felder === | ||
43 | |||
44 | Folgende Felder stehen für Vergleiche zur Verfügung: | ||
45 | |||
46 | * **:header** Dieses Feld ist wohl das vielfältigste, da es Zugriff auf **sämtliche Header-Felder** ermöglicht. Benötigt **keine "require"** Anweisung. | ||
47 | * **: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. | ||
48 | * **:size** Dieses Feld ermöglicht einen Vergleich der Größe der E-Mail. Benötigt **keine "require"** Anweisung. | ||
49 | |||
50 | === 1.4. Aktionen === | ||
51 | |||
52 | **stop;** dient zum **Beenden** der Ausführung des Skripts. Benötigt **keine "require"** Anweisung. | ||
53 | |||
54 | * **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**. | ||
55 | * **discard;** bewirkt, dass die E-Mail **unwiderruflich gelöscht** wird, ohne den Absender zu informieren. Benötigt **keine "require"** Anweisung, diese wird jedoch **empfohlen**. | ||
56 | * **keep;** bewirkt, dass die E-Mail **im Standard-Ordner gespeichert** wird. Überschreibt eine eventuell vorangehende //discard// Aktion. Benötigt **keine "require"** Anweisung. | ||
57 | * **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. | ||
58 | * **redirect " ... ";** bewirkt, dass die E-Mail **umgeleitet** wird. Die Zieladresse wird in Anführungszeichen angegeben. Benötigt **keine "require"** Anweisung, diese wird jedoch **empfohlen**. | ||
59 | |||
60 | === 1.5. Diverses === | ||
61 | |||
62 | **Einzeilige Kommentare** werden mit einem **'#'** eingeleitet. **Mehrzeilige Kommentare** werden mit **"/*" begonnen und mit "*/" **beendet. | ||
63 | |||
64 | Einige Funktionen müssen zu Beginn des Skripts noch explizit eingebunden werden. Das geht mit einer **require** Anweisung. | ||
65 | |||
66 | Beispiel: | ||
67 | |||
68 | |||
69 | {{html wiki="true"}} | ||
70 | {{code}}require ["fileinto", "reject"]; | ||
71 | {{/code}} | ||
72 | {{/html}} | ||
73 | |||
74 | == 2. Beispiele == | ||
75 | |||
76 | === 2.1. Einfache Beispiele === | ||
77 | |||
78 | Das folgende Beispiel sortiert alle E-Mails **von** einer der 3 angegebenen Adressen in der Ordner "freunde" ein: | ||
79 | |||
80 | |||
81 | {{html wiki="true"}} | ||
82 | {{code}}if address :is :all "**From**" ["bob@example.com", "alice@example2.com", "bff@somewhere.de"] { | ||
83 | fileinto "INBOX.freunde"; | ||
84 | } | ||
85 | {{/code}} | ||
86 | {{/html}} | ||
87 | |||
88 | Dieses Beispiel zeigt die Nutzung einer //"if"// Struktur, des //"address"// Feldes, eines exakten Vergleichs mittels //":is"// und einer Liste in //"[ ... ]"//, sowie der //"fileinto"// Aktion. | ||
89 | |||
90 | Es ist auch möglich im Betreff nach Schlüsselwörtern zu suchen: | ||
91 | |||
92 | |||
93 | {{html wiki="true"}} | ||
94 | {{code}}if header :contains "subject" "Facebook" { | ||
95 | discard; | ||
96 | } | ||
97 | {{/code}} | ||
98 | {{/html}} | ||
99 | |||
100 | 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. | ||
101 | |||
102 | Das folgende Beispiel **lehnt** E-Mails** ab**, die größer als **1MB** sind: | ||
103 | |||
104 | |||
105 | {{html wiki="true"}} | ||
106 | {{code}}if size :over 1M { | ||
107 | reject "Bitte sehen Sie davon ab, mir E-Mails mit großen Anhängen zu senden, da mein Mail-Speicher begrenzt ist."; | ||
108 | } | ||
109 | {{/code}} | ||
110 | {{/html}} | ||
111 | |||
112 | |||
113 | === 2.2. Verschieben von Spam-Mails in einen eigenen Ordner === | ||
114 | |||
115 | |||
116 | {{html wiki="true"}} | ||
117 | {{code}}if header :contains "X-Spam-Level" "*******" { | ||
118 | # Wenn der Spam als gelesen markiert werden soll: | ||
119 | # addflag "\\Seen"; | ||
120 | |||
121 | fileinto "INBOX.Junk"; | ||
122 | } | ||
123 | {{/code}} | ||
124 | {{/html}} | ||
125 | |||
126 | === 2.3. Ignorieren bestimmter E-Mails === | ||
127 | |||
128 | |||
129 | {{html wiki="true"}} | ||
130 | {{code}}if address "From" "virusalert@informatik.tu-muenchen.de" { | ||
131 | discard; | ||
132 | } | ||
133 | {{/code}} | ||
134 | {{/html}} | ||
135 | |||
136 | === 2.4. Weiterleiten oder Verschieben nach Betreff === | ||
137 | |||
138 | |||
139 | {{html wiki="true"}} | ||
140 | {{code}}if header :contains "subject" "my_project" { | ||
141 | # Zum Verschieben in einen Ordner | ||
142 | # fileinto "INBOX.project"; | ||
143 | |||
144 | # Zum Weiterleiten mit lokaler Kopie | ||
145 | redirect :copy "me@example.com"; | ||
146 | |||
147 | # Zum Weiterleiten ohne lokale Kopie | ||
148 | # redirect "me@example.com"; | ||
149 | } | ||
150 | {{/code}} | ||
151 | {{/html}} | ||
152 | |||
153 | Zu weiteren Informationen bezüglich Weiterleitungen, lesen Sie bitte [[hier>>Informatik.Helpdesk.IntumMatumEmailWeiterleitungAbwesenheitsnotiz]] nach. | ||
154 | |||
155 | === 2.5. Sortieren nach Adress-Zusätzen === | ||
156 | |||
157 | |||
158 | {{html wiki="true"}} | ||
159 | {{code}}require ["mailbox"]; | ||
160 | |||
161 | if envelope :matches "to" "*+abc@*" { | ||
162 | # Legt den entsprechenden Ordner automatisch an, sofern er noch nicht existiert und verschiebt, die E-Mail, die an *+abc@* kommen dorthin. | ||
163 | fileinto :create "INBOX.abc"; | ||
164 | } | ||
165 | {{/code}} | ||
166 | {{/html}} |