Wiki-Quellcode von Sieve Filterregeln
Zuletzt geändert von Aysegül Omus am 2024/04/05 12:56
Verstecke letzte Bearbeiter
author | version | line-number | content |
---|---|---|---|
8.1 | 1 | = = | |
1.1 | 2 | ||
3 | {{toc/}} | ||
4 | |||
5 | |||
6 | |||
8.1 | 7 | == 1. Syntax == | |
2.1 | 8 | ||
8.1 | 9 | === 1.1. Vergleiche === | |
1.1 | 10 | ||
11 | Sieve kennt insgesamt 6 Vergleiche, davon 3 String Vergleiche (Text) und 3 Integer Vergleiche (Zahlen). | ||
12 | |||
13 | String Vergleiche: | ||
2.1 | 14 | ||
1.1 | 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. | ||
2.1 | 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 | |||
1.1 | 19 | Integer Vergleiche: | |
2.1 | 20 | ||
1.1 | 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. | ||
2.1 | 24 | ||
1.1 | 25 | Zusätzlich kann noch geprüft werden, ob ein bestimmtes Feld im Header vorhanden ist: | |
26 | |||
3.1 | 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. | |
2.1 | 28 | ||
8.1 | 29 | === 1.2. Kontrollstrukturen und Blöcke === | |
1.1 | 30 | ||
31 | Um Fallunterscheidungen zu treffen versteht Sieve die üblichen **if**, **else**, **elsif** Strukturen: | ||
2.1 | 32 | ||
1.1 | 33 | * **if** bedeutet, dass die im darauffolgenden Block festgelegten Aktionen ausgeführt werden, wenn die angegebene Bedingung erfüllt ist. | |
3.1 | 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. | ||
1.1 | 38 | * **not ...** negiert die darauffolgende Bedingung. | |
3.1 | 39 | * **[ ... ]** dient zur **Auflistung von Elementen**, z.B. einer String-Liste: ["Max", "Martin", "Manuel"] . | |
1.1 | 40 | * **{ ... }** dient zur Abgrenzung eines **Aktionsblocks**. | |
41 | |||
8.1 | 42 | === 1.3. Felder === | |
1.1 | 43 | ||
44 | Folgende Felder stehen für Vergleiche zur Verfügung: | ||
2.1 | 45 | ||
3.1 | 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. | ||
1.1 | 49 | ||
8.1 | 50 | === 1.4. Aktionen === | |
1.1 | 51 | ||
3.1 | 52 | **stop;** dient zum **Beenden** der Ausführung des Skripts. Benötigt **keine "require"** Anweisung. | |
2.1 | 53 | ||
3.1 | 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**. | ||
1.1 | 59 | ||
8.1 | 60 | === 1.5. Diverses === | |
1.1 | 61 | ||
3.1 | 62 | **Einzeilige Kommentare** werden mit einem **'#'** eingeleitet. **Mehrzeilige Kommentare** werden mit **"/*" begonnen und mit "*/" **beendet. | |
1.1 | 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"}} | ||
3.1 | 70 | {{code}}require ["fileinto", "reject"]; | |
1.1 | 71 | {{/code}} | |
72 | {{/html}} | ||
73 | |||
8.1 | 74 | == 2. Beispiele == | |
1.1 | 75 | ||
8.1 | 76 | === 2.1. Einfache Beispiele === | |
1.1 | 77 | ||
3.1 | 78 | Das folgende Beispiel sortiert alle E-Mails **von** einer der 3 angegebenen Adressen in der Ordner "freunde" ein: | |
1.1 | 79 | ||
80 | |||
81 | {{html wiki="true"}} | ||
4.1 | 82 | {{code}}if address :is :all "**From**" ["bob@example.com", "alice@example2.com", "bff@somewhere.de"] { | |
83 | fileinto "INBOX.freunde"; | ||
1.1 | 84 | } | |
85 | {{/code}} | ||
86 | {{/html}} | ||
87 | |||
4.1 | 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. | |
1.1 | 89 | ||
90 | Es ist auch möglich im Betreff nach Schlüsselwörtern zu suchen: | ||
91 | |||
92 | |||
93 | {{html wiki="true"}} | ||
6.1 | 94 | {{code}}if header :contains "subject" "Facebook" { | |
1.1 | 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 | |||
4.1 | 102 | Das folgende Beispiel **lehnt** E-Mails** ab**, die größer als **1MB** sind: | |
1.1 | 103 | ||
104 | |||
105 | {{html wiki="true"}} | ||
6.1 | 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."; | ||
1.1 | 108 | } | |
109 | {{/code}} | ||
110 | {{/html}} | ||
111 | |||
112 | |||
8.1 | 113 | === 2.2. Verschieben von Spam-Mails in einen eigenen Ordner === | |
1.1 | 114 | ||
115 | |||
116 | {{html wiki="true"}} | ||
4.1 | 117 | {{code}}if header :contains "X-Spam-Level" "*******" { | |
6.1 | 118 | # Wenn der Spam als gelesen markiert werden soll: | |
119 | # addflag "\\Seen"; | ||
1.1 | 120 | ||
4.1 | 121 | fileinto "INBOX.Junk"; | |
1.1 | 122 | } | |
123 | {{/code}} | ||
124 | {{/html}} | ||
125 | |||
8.1 | 126 | === 2.3. Ignorieren bestimmter E-Mails === | |
1.1 | 127 | ||
128 | |||
129 | {{html wiki="true"}} | ||
4.1 | 130 | {{code}}if address "From" "virusalert@informatik.tu-muenchen.de" { | |
1.1 | 131 | discard; | |
132 | } | ||
133 | {{/code}} | ||
134 | {{/html}} | ||
135 | |||
8.1 | 136 | === 2.4. Weiterleiten oder Verschieben nach Betreff === | |
1.1 | 137 | ||
138 | |||
139 | {{html wiki="true"}} | ||
4.1 | 140 | {{code}}if header :contains "subject" "my_project" { | |
1.1 | 141 | # Zum Verschieben in einen Ordner | |
4.1 | 142 | # fileinto "INBOX.project"; | |
1.1 | 143 | ||
144 | # Zum Weiterleiten mit lokaler Kopie | ||
4.1 | 145 | redirect :copy "me@example.com"; | |
1.1 | 146 | ||
147 | # Zum Weiterleiten ohne lokale Kopie | ||
4.1 | 148 | # redirect "me@example.com"; | |
1.1 | 149 | } | |
150 | {{/code}} | ||
151 | {{/html}} | ||
152 | |||
153 | Zu weiteren Informationen bezüglich Weiterleitungen, lesen Sie bitte [[hier>>Informatik.Helpdesk.IntumMatumEmailWeiterleitungAbwesenheitsnotiz]] nach. | ||
154 | |||
8.1 | 155 | === 2.5. Sortieren nach Adress-Zusätzen === | |
1.1 | 156 | ||
157 | |||
158 | {{html wiki="true"}} | ||
4.1 | 159 | {{code}}require ["mailbox"]; | |
1.1 | 160 | ||
5.1 | 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"; | ||
1.1 | 164 | } | |
165 | {{/code}} | ||
166 | {{/html}} |