Sieve: Unterschied zwischen den Versionen

Aus Foxwiki
Subpages:
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 46: Zeile 46:


= TMP =
= TMP =
'''Sieve''' ist eine [[domänenspezifische Sprache]], die zum Konfigurieren von [[Mailfilter]]n auf [[Mailserver]]n durch Benutzer konzipiert wurde.
'''Sieve''' ist eine [[domänenspezifische Sprache]], die zum Konfigurieren von [[Mailfilter]]n auf [[Mailserver]]n durch Benutzer konzipiert wurde.  
Die genaue Spezifikation kann im RFC 5228 nachgelesen werden.
* Die genaue Spezifikation kann im RFC 5228 nachgelesen werden.
Sieve ist spezifiziert worden, um Nutzern die Möglichkeit zu geben, auf einfache Art eigene Regeln zum Filtern von E-Mails zu definieren. Dabei ist es jedoch nicht möglich, komplexere Programmstrukturen, die beispielsweise mit Schleifen oder Variablen arbeiten, zu benutzen oder externe Programme zu starten.
Sieve ist spezifiziert worden, um Nutzern die Möglichkeit zu geben, auf einfache Art eigene Regeln zum Filtern von E-Mails zu definieren.  
 
* Dabei ist es jedoch nicht möglich, komplexere Programmstrukturen, die beispielsweise mit Schleifen oder Variablen arbeiten, zu benutzen oder externe Programme zu starten.  
Das Hauptaugenmerk von Sieve liegt auf Erweiterbarkeit, Einfachheit und Unabhängigkeit von der verwendeten Zugriffsart und Architektur und dem verwendeten Betriebssystem.
* Das Hauptaugenmerk von Sieve liegt auf Erweiterbarkeit, Einfachheit und Unabhängigkeit von der verwendeten Zugriffsart und Architektur und dem verwendeten Betriebssystem.  
 
* Sieve-[[Skriptdatei|Scripts]] werden bereits während der Zustellung der E-Mail am Posteingangsserver ausgeführt.
Sieve-[[Skriptdatei|Scripts]] werden bereits während der Zustellung der E-Mail am Posteingangsserver ausgeführt.


== Verbreitung ==
== Verbreitung ==
Zeile 61: Zeile 60:


=== Kommentare ===
=== Kommentare ===
Kommentare werden durch das Zeichen "#" eingeleitet. Diese Kommentare gelten immer bis zum Zeilenende. Mehrzeilige Kommentare werden wie in [[C (Programmiersprache)|C]] mit dem String "/*" eingeleitet und mit dem String "*/" abgeschlossen.
Kommentare werden durch das Zeichen "#" eingeleitet.  
* Diese Kommentare gelten immer bis zum Zeilenende.  
* Mehrzeilige Kommentare werden wie in [[C (Programmiersprache)|C]] mit dem String "/*" eingeleitet und mit dem String "*/" abgeschlossen.


=== Zahlen ===
=== Zahlen ===
Nur positive Ganzzahlen sind erlaubt. Optional gibt es die Möglichkeit, die Größe über Angaben wie "'''K'''" ([[Binärpräfix|KiB]], 2^10), "'''M'''" ([[Binärpräfix|MiB]], 2^20) und "'''G'''" ([[Binärpräfix|GiB]], 2^30) anzugeben. Beispiel: 100K steht für eine Größe von 100 [[Binärpräfix|Kibibytes]].
Nur positive Ganzzahlen sind erlaubt.  
* Optional gibt es die Möglichkeit, die Größe über Angaben wie "'''K'''" ([[Binärpräfix|KiB]], 2^10), "'''M'''" ([[Binärpräfix|MiB]], 2^20) und "'''G'''" ([[Binärpräfix|GiB]], 2^30) anzugeben.  
* Beispiel: 100K steht für eine Größe von 100 [[Binärpräfix|Kibibytes]].


=== Strings ===
=== Strings ===
Strings (Zeichenketten) werden durch das Anführungszeichen ''"'' eingeleitet. Ein Backslash ("\") wird verwendet, um weitere Anführungszeichen oder Backslashes zu kennzeichnen, die noch zur aktuellen Zeichenkette gehören (sogenanntes "Escapen"). String-Listen werden mit "[" eingeleitet und mit "]" abgeschlossen.
Strings (Zeichenketten) werden durch das Anführungszeichen ''"'' eingeleitet.  
* Ein Backslash ("\") wird verwendet, um weitere Anführungszeichen oder Backslashes zu kennzeichnen, die noch zur aktuellen Zeichenkette gehören (sogenanntes "Escapen").  
* String-Listen werden mit "[" eingeleitet und mit "]" abgeschlossen.


=== Kontrollstrukturen ===
=== Kontrollstrukturen ===
Die wichtigste Anwendung beim Filtern von E-Mail besteht im Testen auf bestimmte Eigenschaften. Dazu gibt es auch in Sieve die wohlbekannten WENN-DANN-Möglichkeiten:
Die wichtigste Anwendung beim Filtern von E-Mail besteht im Testen auf bestimmte Eigenschaften.  
* <code>if</code>
* Dazu gibt es auch in Sieve die wohlbekannten WENN-DANN-Möglichkeiten:
* <code>elsif</code>
* if
* <code>else</code>
* elsif
* else


Ein <code>if</code> 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 <code>elsif</code> abgefragt werden. Falls keine der Bedingungen aus den "if"- und "elsif"-Blöcken zutrifft, werden die Anweisungen des "else"-Blocks abgearbeitet, sofern er vorhanden ist.
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 er vorhanden ist.


=== Vergleiche von Zeichenketten ===
=== Vergleiche von Zeichenketten ===
Es bestehen mehrere Möglichkeiten, einen String zu testen. Als Vergleichsoperatoren kommen hierbei zum Einsatz:
Es bestehen mehrere Möglichkeiten, einen String zu testen.  
* Als Vergleichsoperatoren kommen hierbei zum Einsatz:


; <code>:contains</code>
; :contains
: prüft, ob eine bestimmte Zeichenkette in einem anderen String enthalten ist.
: prüft, ob eine bestimmte Zeichenkette in einem anderen String enthalten ist.
; <code>:is</code>
; :is
: führt einen exakten Vergleich durch, d.&nbsp;h. die Inhalte der verglichenen Zeichenketten müssen exakt übereinstimmen.
: führt einen exakten Vergleich durch, d.&nbsp;h.  
; <code>:matches</code>
* die Inhalte der verglichenen Zeichenketten müssen exakt übereinstimmen.
: beinhaltet eine Möglichkeit, beim Vergleich Teile einer Zeichenkette ungeprüft zu belassen. Mit dem Symbol <code>*</code> können mehrere, mit dem Symbol <code>?</code> genau ein Zeichen freigestellt werden. So wird beispielsweise <code>G?n</code> alle dreibuchstabigen Wörter mit einem großen G am Anfang und einem kleinen n am Ende finden, während <code>G*n</code> alle Wörter von Gin über Gasmann bis hin zu Gesundheitskartenevaluierungskommission und darüber hinaus adressieren wird.
; :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 ===
=== Adressen-Matching ===
E-Mail-Adressen prüft man mit dem Keyword <code>address</code>. 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 <code>:localpart</code> bzw. <code>:domain</code> genutzt werden. Standardmäßig wird die komplette Adresse geprüft (entspricht <code>:all</code>).
E-Mail-Adressen prüft man mit dem Keyword address.  
* 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 beziehungsweise :domain genutzt werden.  
* Standardmäßig wird die komplette Adresse geprüft (entspricht :all).


=== Größenvergleiche ===
=== Größenvergleiche ===
Die Größe einer Mail prüft man mit dem Keyword <code>size</code>. Vergleiche mit Zahlen kann man mit den Operatoren <code>:over</code> bzw. <code>:under</code> durchführen.
Die Größe einer Mail prüft man mit dem Keyword size.  
* Vergleiche mit Zahlen kann man mit den Operatoren :over beziehungsweise :under durchführen.


=== Header-Felder ===
=== Header-Felder ===
[[Header (E-Mail)|E-Mail Header]] können mit dem Keyword <code>header</code> 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.
[[Header (E-Mail)|E-Mail 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 ===
=== Blöcke ===
Blockanweisungen werden durch <code>{</code> eingeleitet und mit <code>}</code> beendet. Blöcke werden genutzt, um nach einem Test mehrere Anweisungen durchzuführen.
Blockanweisungen werden durch { eingeleitet und mit } beendet.  
* Blöcke werden genutzt, um nach einem Test mehrere Anweisungen durchzuführen.


== Anweisungen ==
== Anweisungen ==
Zeile 104: Zeile 127:


; stop
; stop
: Beendet die Ausführung. Falls keine Regel zugetroffen hat, wird die Nachricht in der INBOX belassen (Impliziertes keep)
: Beendet die Ausführung.  
* Falls keine Regel zugetroffen hat, wird die Nachricht in der INBOX belassen (Impliziertes keep)
; keep
; keep
: Speichert die Nachricht in der INBOX
: Speichert die Nachricht in der INBOX
; redirect
; redirect
: Weiterleiten einer Nachricht. Als Argument wird eine E-Mail-Adresse angegeben.
: Weiterleiten einer Nachricht.  
* Als Argument wird eine E-Mail-Adresse angegeben.
; discard
; discard
: Löscht die Nachricht. Der Absender erhält davon keine Nachricht.
: Löscht die Nachricht.  
* Der Absender erhält davon keine Nachricht.
; reject
; 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.
: 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
; 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.
: 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.


== Erweiterungen ==
== Erweiterungen ==
Zeile 123: Zeile 154:
Das folgende Beispiel nutzt einige der oben beschriebenen Beispiele und definiert ein Beispielskript:
Das folgende Beispiel nutzt einige der oben beschriebenen Beispiele und definiert ein Beispielskript:
<syntaxhighlight lang="C">
<syntaxhighlight lang="C">
# Beispielskript
# Beispielskript
#
#
require ["fileinto", "reject"];
require ["fileinto", "reject"];


# Nachrichten größer 100K werden abgewiesen mit einer Fehlermeldung
# Nachrichten größer 100K werden abgewiesen mit einer Fehlermeldung
#
#


if size :over 100K {
if size :over 100K {
  reject "Bitte senden Sie mir das nächste Mal eine kleinere Mail. Bei großen Anhängen laden Sie bitte die Dateien auf einen Server und schicken Sie mir eine URL. Danke.";
    reject "Bitte senden Sie mir das nächste Mal eine kleinere Mail. Bei großen Anhängen laden Sie bitte die Dateien auf einen Server und schicken Sie mir eine URL. Danke.";
}
}


# Eine Mailingliste soll in einen Ordner "mailinglist" verschoben werden
# Eine Mailingliste soll in einen Ordner "mailinglist" verschoben werden
#
#


elsif address :is ["From", "To"] "mailinglist@example.com" {
elsif address :is ["From", "To"] "mailinglist@example.com" {
  fileinto "INBOX.mailinglist";
    fileinto "INBOX.mailinglist";
# Bei einigen Mailserver-Konfigurationen muss statt eines Punktes hierbei ein Schrägstrich verwendet werden.
# Bei einigen Mailserver-Konfigurationen muss statt eines Punktes hierbei ein Schrägstrich verwendet werden.
}
}


# Spamregel: Nachricht enthält meine Adresse nicht im To, CC oder Bcc
# Spamregel: Nachricht enthält meine Adresse nicht im To, CC oder Bcc
# header, oder Subject ist irgendwas mit "money" bzw. "Viagra".
# header, oder Subject ist irgendwas mit "money" beziehungsweise "Viagra".
#
#


elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "me@example.com",
elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "me@example.com",
header :matches "Subject" ["*money*","*Viagra*"]) {
header :matches "Subject" ["*money*","*Viagra*"]) {
      fileinto "INBOX.spam";
      fileinto "INBOX.spam";
}
}




Zeile 156: Zeile 187:
# bereits abgedeckt.
# bereits abgedeckt.


else {
else {
    keep;
      keep;
}
}
</syntaxhighlight>
</syntaxhighlight>


== Weblinks ==
== Weblinks ==
* RFC 5228
* RFC 5228
* https://de.wikipedia.org/wiki/Sieve


== Einzelnachweise ==
== Einzelnachweise ==

Version vom 21. August 2022, 09:02 Uhr

topic kurze Beschreibung

Beschreibung

Installation

Anwendungen

Syntax

Optionen

Parameter

Umgebungsvariablen

Exit-Status

Konfiguration

Dateien

Sicherheit

Dokumentation

RFC

Man-Pages

Info-Pages

Siehe auch

Links

Projekt-Homepage

Weblinks

Einzelnachweise

Testfragen

Testfrage 1

Antwort1

Testfrage 2

Antwort2

Testfrage 3

Antwort3

Testfrage 4

Antwort4

Testfrage 5

Antwort5

TMP

Sieve ist eine domänenspezifische Sprache, die zum Konfigurieren von Mailfiltern auf Mailservern durch Benutzer konzipiert wurde.

  • Die genaue Spezifikation kann im RFC 5228 nachgelesen werden.

Sieve ist spezifiziert worden, um Nutzern die Möglichkeit zu geben, auf einfache Art eigene Regeln zum Filtern von E-Mails zu definieren.

  • Dabei ist es jedoch nicht möglich, komplexere Programmstrukturen, die beispielsweise mit Schleifen oder Variablen arbeiten, zu benutzen oder externe Programme zu starten.
  • Das Hauptaugenmerk von Sieve liegt auf Erweiterbarkeit, Einfachheit und Unabhängigkeit von der verwendeten Zugriffsart und Architektur und dem verwendeten Betriebssystem.
  • Sieve-Scripts werden bereits während der Zustellung der E-Mail am Posteingangsserver ausgeführt.

Verbreitung

Sieve-Skripte werden heutzutage von einer Vielzahl von Mailservern wie Dovecot oder Exim sowie E-Mail-Clients wie Thunderbird oder Open-Xchange Server direkt oder über Plugins unterstützt.[1][2] Darüber hinaus gibt es Libraries zum Parsen von Sieve-Skripten für die Programmiersprachen C, Ruby, Java, PHP, Perl und Python.[3]

Syntax

Anweisungen werden mit dem Semikolon abgeschlossen.

Kommentare

Kommentare werden durch das Zeichen "#" eingeleitet.

  • Diese Kommentare gelten immer bis zum Zeilenende.
  • Mehrzeilige Kommentare werden wie in C mit dem String "/*" eingeleitet und mit dem String "*/" abgeschlossen.

Zahlen

Nur positive Ganzzahlen sind erlaubt.

  • Optional gibt es die Möglichkeit, die Größe über Angaben wie "K" (KiB, 2^10), "M" (MiB, 2^20) und "G" (GiB, 2^30) anzugeben.
  • Beispiel: 100K steht für eine Größe von 100 Kibibytes.

Strings

Strings (Zeichenketten) werden durch das Anführungszeichen " eingeleitet.

  • Ein Backslash ("\") wird verwendet, um weitere Anführungszeichen oder Backslashes zu kennzeichnen, die noch zur aktuellen Zeichenkette gehören (sogenanntes "Escapen").
  • String-Listen werden mit "[" eingeleitet und mit "]" abgeschlossen.

Kontrollstrukturen

Die wichtigste Anwendung beim Filtern von E-Mail besteht im Testen auf bestimmte Eigenschaften.

  • Dazu gibt es auch in Sieve die wohlbekannten WENN-DANN-Möglichkeiten:
  • 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 er vorhanden ist.

Vergleiche von Zeichenketten

Es bestehen mehrere Möglichkeiten, einen String zu testen.

  • Als Vergleichsoperatoren kommen hierbei zum Einsatz:
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 prüft man mit dem Keyword address.

  • 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 beziehungsweise :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 beziehungsweise :under durchführen.

Header-Felder

E-Mail 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

Blockanweisungen werden durch { eingeleitet und mit } beendet.

  • Blöcke werden genutzt, um nach einem Test mehrere Anweisungen durchzuführen.

Anweisungen

Die folgenden Anweisungen sind laut dem RFC spezifiziert:

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.

Erweiterungen

Sieve gestattet auch zusätzliche Erweiterungen, die am Anfang des Skriptes mit dem Schlüsselwort require deklariert werden müssen.

Beispiel

Das folgende Beispiel nutzt einige der oben beschriebenen Beispiele und definiert ein Beispielskript:

 # Beispielskript
 #
 require ["fileinto", "reject"];

 # Nachrichten größer 100K werden abgewiesen mit einer Fehlermeldung
 #

 if size :over 100K {
    reject "Bitte senden Sie mir das nächste Mal eine kleinere Mail. Bei großen Anhängen laden Sie bitte die Dateien auf einen Server und schicken Sie mir eine URL. Danke.";
 }

 # Eine Mailingliste soll in einen Ordner "mailinglist" verschoben werden
 #

 elsif address :is ["From", "To"] "mailinglist@example.com" {
    fileinto "INBOX.mailinglist";
 # Bei einigen Mailserver-Konfigurationen muss statt eines Punktes hierbei ein Schrägstrich verwendet werden.
 }

 # Spamregel: Nachricht enthält meine Adresse nicht im To, CC oder Bcc
 # header, oder Subject ist irgendwas mit "money" beziehungsweise "Viagra".
 #

 elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "me@example.com",
 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;
 }

Weblinks

Einzelnachweise