Wiki-Quellcode von Sieve Filterregeln

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

Zeige letzte Bearbeiter
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}}