Erstellen von Sieve-Skripten |
Scrollen Zurück Oberste Ebene Weiter Mehr |
Diese Seite bietet, neben den Seiten Sieve-Skripte und Sieve-Erweiterungen für SecurityGateway, einen grundlegenden Überblick über die Sieve-Filtersprache für E-Mail und ihre Implementation in SecurityGateway. Der erste Abschnitt dieser Seite gibt einen Überblick über die grundlegenden Bestandteile eines Sieve-Skripts. Der nächste Abschnitt bietet einen Überblick über verschiedene Struktur-Elemente der Sprache. Es folgen Übersichten über die Standard-Befehle für Steuerung, Test und Aktionen, die unterstützt werden. Und schließlich finden sich am Ende der Seite mehrere Beispiel-Skripte, aus denen Sie Anregungen entnehmen können.
Falls Sie an weiteren Informationen über Sieve interessiert sind, sollten Sie die, allerdings in englischer Sprache verfügbaren, offiziellen Dokumente auf der Website der IETF online einsehen: Sieve: An Email Filtering Language (RFC-5228), Sieve's Copy Extension (RFC 3894), Sieve's Body Extension (RFC-5173), Sieve's Reject Extension (RFC-5429), Sieve's Variables Extension (RFC-5229) und Spamtest and VirusTest Extensions (RFC-3685). Sie können auch unter www.mdaemon.com/Support/ die neuesten Optionen für technische Unterstützung und Hilfe zu SecurityGateway erhalten. Hierzu gehören die telefonische Unterstützung, Unterstützung per E-Mail, eine Wissensdatenbank, oft gestellte Fragen (FAQ), Foren und anderes mehr. |
Ein Sieve-Skript besteht aus vier grundlegenden Bestandteilen:
1.Anforderungen—In diesem Teil werden die Sieve-Erweiterungen definiert, die für ein bestimmtes Skript erforderlich sind. Werden in einem Skript Befehle benutzt, die zu einer optionalen Erweiterung gehören, so müssen alle betroffenen optionalen Erweiterungen zwingend mithilfe des Befehls require am Beginn des Skripts bezeichnet und einbezogen werden. An das Ende der Parameter, die auf den Befehl require folgen, muss ein Strichpunkt gesetzt werden.
Beispiele:
require "securitygateway";
-und-
require ["securitygateway", "fileinto"];
2.Bedingungen—In diesem Teil des Skripts werden die Komponenten bezeichnet, nach denen Sie in einer Nachricht suchen wollen. Es werden auch die anzuwendenden Such- und Vergleichsverfahren bestimmt.
Beispiele:
if size :over 1M
-und-
if header :contains ["to", "cc"] "Frank Thomas"
3.Aktionen—Hier werden die Aktionen und Befehle festgelegt, die ausgeführt werden, falls die oben bestimmten Bedingungen das Ergebnis True erbringen. Jede Aktion muss durch einen Strichpunkt abgeschlossen sein, und jede Gruppe von Aktionen muss in geschweifte Klammern ("{" und "}") gesetzt sein.
Beispiele:
if size :over 1M { discard; }
-und-
if header :contains ["to", "cc"] "Frank Thomas" {
bayes-learn "spam";
fileinto "spam";
}
4.Kommentare—Sie können zu Erläuterungszwecken Kommentare in Ihre Sieve-Skripte einfügen, etwa, als Gedächtnisstütze für den Zweck des Sieve-Skripts oder aus sonstigen Gründen. Es sind zwei Arten von Kommentaren zugelassen: einzeilige und mehrzeilige Kommentare. Einzeilige Kommentare beginnen mit "#" und Enden am Zeilenende (also beim nächsten CRLF). Mehrzeilige Kommentare beginnen mit "/*", können sich über mehrere Zeilen erstrecken, und enden mit "*/".
Beispiele:
# Nachrichten über 1 MB werden verworfen
if size :over 1M { discard; }
-und-
if header :contains "from" "Frank Thomas" {
/* Frank Thomas sendet uns überwiegend Spam, deswegen verschiebt
dieses Skript automatisch alle von ihm erhaltenen Nachrichten
in die Quarantäne der Benutzer. */
fileinto "spam";
}
Strings
Text-Strings oder Zeichenketten beginnen und enden mit je einem Anführungs- und Schlusszeichen. Ein Beispiel: "Frank Thomas".
In Anführungs- und Schlusszeichen gesetzte Texte dürfen ihrerseits umgekehrte Schrägstriche (Backslashes) und Anführungs- und Schlusszeichen nur enthalten, wenn diesen Zeichen ein weiterer Backslash vorangestellt wird. Es werden daher in einem solchen String \\ als \ und \" als " behandelt. Anderen Zeichen soll in den Strings kein Escape-Zeichen vorangestellt werden.
Listen von Strings
Falls Sie in einem Skript eine Gruppe von Strings nutzen möchten, trennen Sie jeden in Anführungs- und Schlusszeichen gesetzten String durch ein Komma ab, und setzen sie die gesamte Gruppe in eckige Klammern.
Ein Beispiel:
if header :contains ["to", "cc"] ["me@xyz.com", "you@xyz.com", "us@xyz.com"]
Der im Beispiel genannte Test zeigt das Ergebnis True , falls entweder die Kopfzeile To oder die Kopfzeile CC eine der drei aufgeführten Adressen enthält.
Kopfzeilen
Die Namen von Kopfzeilen dürfen keinen Doppelpunkt enthalten.
Ein Beispiel:
if header :is "to:" (unzulässig)
if header :is "to" (zulässig)
Listen von Tests
Ähnlich wie Gruppen von Strings, können auch Gruppen von Tests in ein Skript eingefügt werden, indem die Gruppe in runde Klammern gesetzt wird. Diese Vorgehensweise ist bei Nutzung der Test-Befehle allof und anyof bisweilen nötig, da sie logischen "UND"- und "ODER"-Ausdrücken entsprechen.
Ein Beispiel:
if anyof (size :over 1M, header :contains "subject" ["big file", "mega file"])
{
discard;
}
Parameter und Vergleichsoperatoren
Zu den meisten Befehlen gehört mindestens ein Parameter oder Argument, der festlegt, wie genau der Befehl verfahren soll. Es sind mehrere Arten von Parametern verfügbar, wie etwa Positions-Parameter, getaggte Parameter und optionale Parameter. Getaggte Parameter und Vergleichsoperatoren wird beispielsweise ein Doppelpunkt vorangestellt. :contains, :is, :matches, :over und :under sind Beispiele für getaggte Parameter. Einige getaggte Parameter sind auf bestimmte Befehle beschränkt. Weitere Informationen über die verschiedenen Typen von Parametern enthält RFC-5228.
Aktionen
Jede Aktion muss durch einen Strichpunkt abgeschlossen werden, und jede Gruppe von Aktionen muss in geschweifte Klammern gesetzt werden.
Ein Beispiel:
if header :contains ["to", "cc"] "Frank Thomas" {
bayes-learn "spam";
fileinto "spam";
}
Die Sieve-Sprache kennt drei Steuerbefehle:
require
Dieser Steuerbefehl wird am Anfang eines Skripts eingesetzt und bestimmt, welche optionalen Erweiterungen in dem Skript verwendet werden.
Ein Beispiel:
require ["securitygateway", "fileinto"];
if / elsif / else
Der Befehl if ist der wichtigste Steuerbefehl. Obwohl es, technisch gesehen, drei in Wechselbeziehung stehende Befehle gibt, können elsif und else nicht unabhängig von if verwendet werden. Tritt if in einem Skript auf, so wird die zugehörige Bedingung darauf hin geprüft, ob sie wahr ist. Ist dies der Fall, so werden die hiermit verknüpften Aktionen ausgeführt.
Ergibt die Prüfung nach if das Ergebnis falsch, so wird als nächstes elsif geprüft. Ergibt elsif das Ergebnis wahr, so werden die hiermit verknüften Aktionen ausgeführt. Ergibt auch die Prüfung nach elsif das Ergebnis falsch, so wird der Vorgang mit dem jeweils nächsten Befehl elsif fortgesetzt, bis nach einer Prüfung das Ergebnis wahr eintritt.
Ergeben alle Prüfungen nach if und elsif das Ergebnis falsch, und folgt ein Befehl else, so werden die mit diesem Befehl verknüpften Aktionen ausgeführt.
stop
Der Befehl stop beendet die Verarbeitung des Skripts.
Nachfolgend sind die Standard-Test-Befehle beschrieben, die die Sieve-Implementation von SecurityGateway unterstützt. Die Befehle body und envelope sind jedoch Erweiterungen; falls Sie einen dieser Befehle in einem Skript verwenden wollen, müssen Sie sie mithilfe des Befehls require einbinden. Es stehen in der Erweiterung securitygateway noch zahlreiche weitere Test-Befehle zur Verfügung. Sie sind auf der Seite Sieve-Erweiterungen für SecurityGateway beschrieben.
address
Durch diesen Befehl können Sie eine Kopfzeile auswerten, wobei die Auswertung auf eine in der Kopfzeile enthaltene E-Mail-Adresse beschränkt wird und sonstige Inhalte der Kopfzeile, wie etwa allgemeine Texte und Namen, außer Betracht bleiben. Enthält beispielsweise die Kopfzeile "to" den Text "Frank Thomas" <frank@example.com>, so würde die Prüfung header :is "to" "frank@example.com" ein negatives Ergebnis erbringen. Die Prüfung address :is "to" "frank@example.com" würde hingegen ein positives Ergebnis erbringen, weil hierbei nur die Adresse ausgewertet und berücksichtigt wird.
Für diesen Befehl stehen auch drei optionale getaggte Parameter zur Verfügung: ":localpart", ":domain" und ":all". Der Parameter :localpart wertet nur den linken Teil der Adresse aus (im Beispiel oben "frank" aus "frank@example.com"), der Parameter :domain wertet nur die Domäne einer Adresse aus (im Beispiel "example.com"), und :all wertet die gesamte Adresse aus. Werden keine Parameter angegeben, so wird per Voreinstellung :all genutzt.
Ein Beispiel:
require "fileinto";
if address :domain :is "from" "spammer.com" {
fileinto "spam";
}
allof
Hierdurch wird eine logische UND-Verknüpfung hergestellt. Alle geprüften Bedingungen müssen wahr sein, damit die verknüpfte Aktion ausgeführt wird.
Ein Beispiel:
if allof (header :contains "from" "J.Lovell", header :contains "to" "Bubba")
{
fileinto "spam";
}
anyof
Hierdurch wird eine logische ODER-Verknüpfung hergestellt. Es muss eine beliebige der geprüften Bedingungen wahr sein, damit die verknüpfte Aktion ausgeführt wird.
Ein Beispiel:
if anyof (size :over 1M, header :contains "subject" "große Dateianlage")
{
reject "Ich möchte keine Nachrichten, die behaupten, große Dateianlagen zu haben.";
}
body
Der Befehl body ist eine optionale Erweiterung. Um sie in einem Skript zu nutzen, müssen Sie daher den Befehl require "body" an den Beginn des Skripts setzen. Der Befehl wertet den Nachrichtentext einer Nachricht aus. Nähere Informationen hierzu erhalten Sie in dem Artikel Sieve's Body Extension (RFC-5173).
Ein Beispiel:
require ["body", "fileinto"];
if body :text :contains "Geheim-Formel" {
fileinto "admin";
}
envelope
Der Befehl envelope ist eine optionale Erweiterung. Um sie in einem Skript zu nutzen, müssen Sie daher den Befehl require "envelope" an dem Beginn des Skripts setzen. Der Befehl wertet die Inhalte des SMTP-Umschlags SMTP MAIL From und RCPT To aus; hierzu müssen als Parameter "from" und "to" eingesetzt werden.
Ein Beispiel:
require "envelope";
if envelope :is "from" "MrsFrank@company.com" {
redirect "frankshome@example.com";
}
exists
Diese Prüfung ergibt "wahr", falls die in den Parametern angegebenen Kopfzeilen in der Nachricht vorhanden sind. Es müssen jeweils alle angegebenen Kopfzeilen vorhanden sein.
Beispiele:
if exists "x-custom-header" {
redirect "admin@example.com";
}
-und-
if not exists ["from", "date"] {
discard;
}
false
Diese Prüfung ergibt immer das Ergebnis "falsch".
header
Diese Prüfung ergibt "wahr", falls der Inhalt der angegebenen Kopfzeile mit den angegebenen Bedingungen übereinstimmt. Wird kein Vergleichsoperator angegeben, so wird per Voreinstellung :is genutzt.
Ein Beispiel:
require "fileinto"
if header :is "x-custom-header" "01" {
fileinto "admin";
}
not
Die Verwendung dieses Befehls in Verbindung mit einer anderen Prüfung bedeutet, dass das Ergebnis der Prüfung umgekehrt sein muss, damit die mit der Prüfung verknüpfte Aktion ausgeführt wird. Beispielsweise bedeutet die Prüfung if not exists ["from", "date"] { discard; }, dass die Aktion discard ausgeführt wird, falls eine Nachricht die Kopfzeilen "from" und "date" nicht beide enthält. Würde in dem Beispiel der Befehl not weggelassen werden, so würde die Nachricht gelöscht werden, falls die Kopfzeilen beide existierten.
size
Zu dem Befehl size gehören die getaggten Parameter ":over" und ":under", nach denen jeweils ein numerischer Wert folgen muss. Diese Parameter bestimmen, ob die Größe einer Nachricht über oder unter dem angegebenen Wert liegen muss, damit die Prüfung das Ergebnis "wahr" erbringt. Um zu bestimmen, dass der Wert in Megabyte angegeben ist, können Sie dem Wert ein M anfügen, für Kilobyte ein K, und für Byte wird kein Buchstabe angefügt.
Ein Beispiel:
if size :over 500K {
discard;
}
true
Diese Prüfung ergibt immer das Ergebnis "wahr".
spamtest
Der Befehl spamtest ist eine optionale Sieve-Erweiterung, die in dem Dokument Spamtest and VirusTest Extensions (RFC-3685) auf der Website ietf.org näher beschrieben ist. Dieses Dokument enthält Einzelheiten zu dieser Erweiterung.
virustest
Der Befehl virustest ist eine optionale Sieve-Erweiterung, die in dem Dokument Spamtest and VirusTest Extensions (RFC-3685) auf der Website ietf.org näher beschrieben ist. Dieses Dokument enthält Einzelheiten zu dieser Erweiterung.
Nachfolgend sind die Standard-Aktions-Befehle beschrieben, die von SecurityGateway unterstützt werden. Die Befehle fileinto und reject sind jedoch Erweiterungen; falls Sie einen dieser Befehle in einem Skript verwenden wollen, müssen Sie sie mithilfe des Befehls require einbinden. Es stehen in der Erweiterung securitygateway noch zahlreiche weitere Aktions-Befehle zur Verfügung. Sie sind auf der seite Sieve-Erweiterungen für SecurityGateway beschrieben.
fileinto
Der Aktions-Befehl fileinto ist eine optionale Erweiterung. Um sie in einem Skript zu nutzen, müssen Sie daher den Befehl require "fileinto" an den Beginn des Skripts setzen. Zu diesem Befehl gehören zwei Parameter: "spam" und "admin". "spam" verschiebt die Nachricht in die Quarantäne des Benutzers, und "admin" verschiebt sie in die Administrative Quarantäne.
Ein Beispiel:
require "fileinto";
if header :contains "from" "Frank Thomas" {
fileinto "spam";
}
discard
Durch diesen Befehl wird eine Nachricht ohne weiteres gelöscht. Es werden auch keine Statusnachrichten über den Löschvorgang versandt.
Ein Beispiel:
if size :over 2M { discard; }
keep
Diese Aktion bewirkt, dass die Nachricht an dem Standard-Speicherort gespeichert wird.
redirect
Dieser Befehl leitet die Nachricht an die in dem zugehörigen Parameter angegebene Adresse um, wobei der Nachrichtentext und die bestehenden Kopfzeilen nicht geändert werden. Dieser Befehl unterstützt auch die optionale Erweiterung :copy, die bewirkt, dass eine Kopie der Nachricht an die angegebene Adresse gesandt, die Nachricht selbst aber nicht umgeleitet wird. Es sind dann zusätzlich zum Versand der Kopie weitere Aktionen möglich.
Ein Beispiel:
require "copy";
if header :contains "subject" "Antwort auf XYZ" {
redirect :copy "offers@example.com";
bayes-learn "ham";
}
reject
Der Aktions-Befehl reject ist eine optionale Erweiterung. Um sie in einem Skript zu nutzen, müssen Sie daher den Befehl require "reject" an den Beginn des Skripts setzen. Dieser Befehl bewirkt, dass die Nachricht während der SMTP-Verbindung mit einem Antwortkode 5xx angewiesen wird; dabei kann eine kurze, im Parameter angegebene Meldung übermittelt werden.
Ein Beispiel:
require "reject";
if size :over 5M {
reject "Empfang nicht möglich! Diese Nachricht ist zu groß.";
}
vnd.mdaemon.securewebmsg
Dieser Aktions-Befehl bewirkt, dass eine Nachricht mithilfe des SecurityGateway-Portals für Sichere Nachrichten versandt wird.
Ein Beispiel:
require ["securitygateway","reject","fileinto","envelope","body","regex"];
if allof(header :matches "subject" "[Sichere Nachricht]*")
{
vnd.mdaemon.securewebmsg;
}
Alle Nachrichten abweisen, deren Betreffzeile "[SPAM]" enthält
require "reject";
if header :contains "subject" "[SPAM]"
{
reject "Ich will Ihren Spam nicht haben";
}
Alle Nachrichten an einen bestimmten Vor- und Nachnamen abweisen
require ["securitygateway","reject"];
if header :contains "to" "Vor- und Nachname"
{
bayes-learn "spam";
reject "Ich will Ihren Spam nicht haben";
}
Benutzerdefiniertes Bayes'sches automatisches Lernverfahren
require ["securitygateway","comparator-i;ascii-numeric"];
if allowlisted
{
bayes-learn "ham";
}
elsif anyof(blocklisted,spamtotal :value "gt" :comparator "i;ascii-numeric" "20.0")
{
bayes-learn "spam";
}
Treffer aus DNSBL in Graue Liste eintragen
require "securitygateway"];
if not lookup "rblip" "all" {greylist;}
Administrator benachrichtigen, wenn große Nachrichten eingehen
require ["securitygateway"];
if size :over 1M
{
alert text:
To: admin@company.mail
From: postmaster@$RECIPIENTDOMAIN$
Subject: Nachricht des Inhaltsfilters von SecurityGateway
X-Attach-Msg: No
$RECIPIENT$ hat eine Nachricht empfangen, die größer als 1MB ist.
.
;
}
Als sichere Nachricht senden, falls die Betreffzeile mit "[Sichere Nachricht]" beginnt
require ["securitygateway","reject","fileinto","envelope","body","regex"];
if allof(header :matches "subject" "[Sichere Nachricht]*")
{
vnd.mdaemon.securewebmsg;
}