Sieve ist eine speziell für die Konfiguration von Mailfiltern auf Mailservern entwickelte domänenspezifische Sprache. Eine ausführliche Spezifikation dieser Sprache findet sich im RFC 5228. Der Hauptzweck von Sieve besteht darin, Benutzern die Möglichkeit zu geben, auf einfache Weise ihre eigenen Regeln für die Filterung von eMails zu definieren. Es ist jedoch zu beachten, dass die Verwendung komplexerer Programmstrukturen, die beispielsweise Schleifen oder Variablen beinhalten oder das Starten externer Programme ermöglichen, in Sieve nicht möglich ist.
Sieve legt den Fokus insbesondere auf Erweiterbarkeit, Einfachheit und Unabhängigkeit von der zugrunde liegenden Zugriffsart, der Architektur des Systems und dem verwendeten Betriebssystem. Diese Merkmale machen Sieve zu einer vielseitigen Lösung, die sich an unterschiedliche Anforderungen und Umgebungen anpassen kann.
Es ist erwähnenswert, dass Sieve-Skripte bereits während des Zustellprozesses der eMail am Posteingangsserver ausgeführt werden. Diese frühe Ausführung ermöglicht eine effektive und schnelle Anwendung der definierten Filterregeln, noch bevor die eMail im Postfach des Empfängers landet.
Sieve kann aber nicht nur direkt auf einem Mailserver eingesetzt werden, sondern wird auch von diversen eMail Clients genutzt, teilweise auch über Plugins, die zum Beispiel in Thunderbird integriert werden können. Aber auch eMail Provider, wie zum Beispiel Protonmail bieten den Endkunden eine Funktion, um eigene Sieve Skripts nutzen zu können.
Die Syntax ist gerade für Anfänger etwas kryptisch. Daher versuche ich einen kleinen Einstieg in diese äußerst praktische und nicht mehr weg zu denkende Skriptsprache zu geben.
Inhalt
Format eines Slieve Filters
Der Aufbau eines Slieve Skripts ist eigentlich recht einfach aufgebaut und besteht aus 3 Elementen:
- Module die genutzt werden
- Auf was soll der Filter angewendet werden?
- Was soll mit dem Ergebnis passieren?
Hier ein einfaches Beispiel, welches eingehende Emails vom Absender info@email.de einen Label, bzw. eine Kategorie zugewiesen werden soll:
# Folgende Module werden benötigt
require ["fileinto", "imap4flags"];
# Der Filter soll immer dann greifen, wenn eine eMail mit dem Absender info@email.de empfangen wird
if address :is "from" "info@email.de"
# Wenn der obige Filter eine entsprechende Mail empfängt, dann folgendes damit machen: Kategorie mit dem Namen "Wichtig" zuweisen
{
fileinto "Wichtig";
}Die beiden Module dienen dazu, dass Mail verschoben, bzw. Kategorisiert werden können. Und entsprechend auf die IMAP Kennzeichen angepasst werden.
Der Filter selber ist noch recht einfach und erklärt sich fast von selber: Wenn eine eMailadresse (address) im Absenderfeld (:is "from") die folgende eMail ("info@email.de") stehen hat, dann markiere (fileinto) diese mit dem Bezeichner ("Wichtig"). Die Anführungszeichen werden nicht ausgewertet, sondern nur der Inhalt zwischen den Anführungszeichen.
Wenn also der Mailserver eine eMail von info@email.de empfängt, wir diese sofort mit der entsprechenden Kategorie gekennzeichnet, noch bevor der eMail Client diese abgerufen hat. Und bei jedem Empfang einer eMail, werden diese Filter durchlaufen. Es ist problemlos möglich, mehrere Filter gleichzeitig zu nutzen. So können auf diese Wiese Mails direkt sortiert, gekennzeichnet oder verschoben werden. Auch automatische Antwortfilter, zum Beispiel im Urlaub sind möglich. Und natürlich als Spam-Filter sind diese geradezu ideal. Denn es kann auf so ziemlich alles getestet und dann entsprechend reagiert werden. So kann man bekannte Domains von Spammern komplett sperren, so dass diese direkt beim eingehen auf dem Mailserver verworfen, also gelöscht werden.
Sieve Module
Es gibt verschiedene Module, die verwendet werden können. Um nur mal die wichtigsten zu nennen:
| body | Den Mailinhalt, also die eigentliche Nachricht untersuchen |
| copy | Nachrichten, die weitergeleitet werden, speichern |
| date | Zeitstempel auswerten |
| discard | Mail löschen |
| editheader | Den Nachrichtenkopf modifizieren |
| encoded-character | Numerische kodierung von Sonderzeichen |
| enotify | Benachrichtigungen versenden |
| envelope | Einträge im Nachrichtenkopf auswerten |
| environment | Informationen über den Sieve Interpreter auslesen |
| fileinto | Verschieben von Nachrichten |
| ihave | Verfügbare Sieve Module abfragen |
| imap4flag | IMAP Kennzeichen setzen |
| include | Andere Slieve Skripte hinzuladen, praktisch bei großen Skripten |
| keep | Mail in INBOX speichern |
| mailbox | Um IMAP Ordner anzulegen, bzw. festzustellen, ob dieser schon existiert |
| redirect | Mail an eine andere Adresse weiterleiten |
| regex | Regular Expression Support |
| reject | Mail abweisen |
| relational | Erweiterung um relationale Abfragen |
| spamtest | Wenn ein zusätzliches Plugin für SPAM und Virenschutz verwendet wird |
| spamtestplus | Wenn ein zusätzliches Plugin für SPAM und Virenschutz verwendet wird |
| stop | Beendet die Ausführung |
| subaddress | Den Empfänger auf Unteradressen prüfen |
| vacation | Abwesenheitsmeldung an Absender senden |
| variables | Variablen nutzen |
| virustest | Wenn ein zusätzliches Plugin für SPAM und Virenschutz verwendet wird |
Für jeden Anwendungsfall sollte entsprechend das oder die jeweilige(n) Modul(e) angegeben werden. Dies geschieht durch den Befehl require"<MODULNAME>". Wenn mehrere Module benötigt werden, werden die einzelnen Module durch Komma getrennt in eckige Klammern gesetzt: require ["<MODULNAME1>", "<MODULNAME2>"]
Zum Beispiel:
require "fileinto";
oder bei mehreren Modulen:
require ["fileinto", "imap4flags", "vacation"];
Die require-Anweisung wird hauptsächlich dann verwendet, wenn spezifische Sieve-Erweiterungen oder Funktionen genutzt werden sollen, die nicht im Standardumfang enthalten sind. Wenn also Funktionen verwendet werden, die durch require aktiviert werden müssen, ist es wichtig, dies im Sieve-Skript anzugeben. Andernfalls könnten Fehler oder unerwartete Ergebnisse eintreten, wenn die erforderlichen Funktionen nicht verfügbar sind.
Zusammenfassend ist die Verwendung von require optional, es sei denn, es werden spezifische Funktionen oder Erweiterungen benötigt, die durch diese Anweisung aktiviert werden müssen.
Filterregel
Der if-Befehl in Sieve wird verwendet, um Bedingungen zu definieren, unter denen bestimmte Aktionen auf eMails angewendet werden sollen. Die grundlegende Syntax des if-Befehls lautet:
if <Bedingung> { // Aktionen, die ausgeführt werden sollen, wenn die Bedingung wahr ist }Hier sind einige wichtige Aspekte und Möglichkeiten in Bezug auf den if-Befehl in Sieve:
1. Bedingungen
Sieve unterstützt verschiedene Arten von Bedingungen, die auf verschiedenen Teilen der eMail basieren können. Einige häufige Bedingungstypen sind:
address: Überprüft Absender- oder Empfängeradressen.header: Überprüft den Inhalt von eMail-Headern.body: Überprüft den Inhalt des eMail-Körpers.exists: Überprüft, ob ein bestimmtes Header-Feld existiert.trueundfalse: Statische Bedingungen, die immer wahr bzw. immer falsch sind.
Beispiel:
if address :is "from" "info@email.de"
{
fileinto "Inbox";
}2. Logische Operatoren
Sieve unterstützt logische Operatoren wie allof (UND), anyof (ODER) und not (NICHT), die verwendet werden können, um mehrere Bedingungen zu kombinieren oder zu verneinen.
Beispiel:
if anyof (header :contains "Subject" "Important", address :is "from" "info@email.de")
{
fileinto "Important";
}3. Header-Überprüfung
Mit header können Sie den Inhalt von eMail-Headern überprüfen. Sie können beispielsweise prüfen, ob der Betreff (Subject) einer eMail einen bestimmten Text enthält.
Beispiel:
if header :contains "Subject" "Besprechung"
{
fileinto "Besprechung";
}4. Adressen-Überprüfung
Mit address können Sie Absender- oder Empfängeradressen überprüfen.
Beispiel:
if address :is "from" "info@email.de"
{
fileinto "Wichtig";
}5. Nachrichten-Inhalt überprüfen
Die body-Bedingung ermöglicht es Ihnen, den Inhalt des eMail-Körpers zu überprüfen.
Beispiel:
if body :contains "Wichtige Informationen"
{
fileinto "Wichtig";
}6. Negation (NICHT)
Mit dem not-Operator können Sie eine Bedingung verneinen.
Beispiel:
if not address :is "from" "info@email.de"
{
fileinto "Inbox";
}Dies sind grundlegende Möglichkeiten zur Verwendung des if-Befehls in Sieve. Die genaue Syntax und verfügbaren Bedingungen können je nach der Sieve-Implementierung variieren. Es ist ratsam, die Dokumentation der spezifischen Sieve-Engine zu konsultieren, die Sie verwenden, um detailliertere Informationen zu erhalten.
Beispiele
eMails von einem bestimmten Absender in einen Ordner verschieben
In diesem Beispiel wird die fileinto-Aktion verwendet, um eMails von einem bestimmten Absender in einen Ordner zu verschieben. Die require-Anweisung aktiviert die imap4flags-Erweiterung für die Verwendung von IMAP-Flags.
require ["imap4flags"];
if address :is "from" "info@email.de"
{
fileinto "Important";
addflag "\\FlagName";
}- Das Skript erfordert die
imap4flags-Erweiterung. - Wenn die Absenderadresse mit “info@email.de” übereinstimmt, wird die eMail in den Ordner “Important” verschoben, und es wird das IMAP-Flag mit dem Namen “FlagName” hinzugefügt.
eMails mit einem bestimmten Betreff und Text im Inhalt ablehnen
Hier wird die reject-Aktion verwendet, um eMails mit einem bestimmten Betreff und Text im Körper abzulehnen.
require ["reject"];
if allof (header :contains "Subject" "Spam", body :contains "Wir schenken Dir")
{
reject "Diese Nachricht sieht nach SPAM aus!";
}- Das Skript erfordert die
reject-Erweiterung. - Wenn sowohl der Betreff “Spam” enthält als auch der Körper den Text “Wir schenken Dir” enthält, wird die eMail mit einer Ablehnungsnachricht abgelehnt.
Diese Beispiele sollen die Verwendung von require und if-Bedingungen in Sieve-Skripten illustrieren. Es ist wichtig zu beachten, dass die Verfügbarkeit von Erweiterungen und das genaue Verhalten von Bedingungen von der konkreten Sieve-Implementierung abhängen können. Daher ist es ratsam, die Dokumentation der Sieve-Engine zu konsultieren, die verwendet wird
eMails von bestimmten Domains direkt löschen
Es gibt bekannte Domains, die von SPAM Firmen stammen. Diese nutzen zusätzlich Subdomains, die sich ständig ändern. Um diese eingehenden Nachrichten direkt zu löschen, kann man mit Platzhaltern arbeiten.
if address :domain :matches "from" ["*.preis-checker.net", "*.enlinea-media.de", "*.mycheck.de"]
{
discard;
}- In diesem Fall wird kein
requirebenötigt, dadiscardim Sieve Standard enthalten ist. - Alle Mails, die von Subdomains der Domains preis-checker.net, enlinea-media.de und mycheck.de kommen, werden sofort verworfen.
Filter für Newsletter
In diesem Beispiel werden eMails von bestimmten Absendern, die im Betreff das Wort “Newsletter” enthalten, in einen speziellen Ordner verschoben und mit dem Flag “Gelb” markiert.
require ["imap4flags"];
if allof (address :is "from" "newsletter@email.de", header :contains "Subject" "Newsletter")
{
fileinto "Newsletter";
addflag "\\FlagYellow";
}- Das Skript erfordert die
imap4flags-Erweiterung. - Wenn die eMail von der Adresse “newsletter@email.de” stammt und im Betreff das Wort “Newsletter” enthält, wird sie in den Ordner “Newsletter” verschoben und mit dem IMAP-Flag “FlagYellow” markiert.
Filter für wichtige Kontakte
Hier wird eine komplexe Bedingung verwendet, um eMails von wichtigen Kontakten zu markieren und in verschiedene Ordner zu verschieben.
require ["imap4flags"];
if anyof ( allof (address :is "from" "chef@email.de", header :contains "X-Priority" "high"), allof (address :is "from" "co-chef@email.de", header :contains "Subject" "Wichtig") )
{
fileinto "Wichtig";
addflag "\\RedFlag"; }
else
{
fileinto "Inbox";
}- Das Skript erfordert die
imap4flags-Erweiterung. - Wenn die eMail entweder von “chef@email.de” stammt und im Header “X-Priority” den Wert “high” hat, oder von “co-chef@email.de” stammt und im Betreff das Wort “Wichtig” enthält, wird die eMail in den Ordner “Wichtig” verschoben und mit dem IMAP-Flag “RedFlag” markiert. Andernfalls wird sie in den regulären “Inbox”-Ordner verschoben.
Natürlich, hier sind zwei etwas komplexere Beispiele für Sieve-Filter, die verschiedene Bedingungen und Aktionen kombinieren:
Diese Beispiele sollen die Flexibilität und die verschiedenen Möglichkeiten der Sieve-Skript-Syntax verdeutlichen. Je nach den spezifischen Anforderungen können Bedingungen und Aktionen kombiniert werden, um eMails auf unterschiedliche Weisen zu filtern und zu organisieren.
Zusammenfassung
Sieve ist eine mächtige und flexible Skriptsprache für die eMail-Filterung:
- Regelbasierte Filterung: Sieve ermöglicht es, eMail-Filterregeln zu definieren, die auf verschiedenen Kriterien basieren, wie Absender, Betreff, Inhalt und mehr.
- Serverseitige Filterung: Die Filter werden auf dem eMail-Server angewendet, bevor die eMails im Posteingang des Nutzers erscheinen, was die Verwaltung von eMails effizienter macht.
Grundlegende Sieve-Syntax:
- if-Bedingungen: Sieve-Regeln bestehen in der Regel aus
if-Bedingungen, die festlegen, wann eine Regel angewendet werden soll. - Aktionen: Verschiedene Aktionen wie
fileinto(Verschieben in Ordner),discard(Löschen),reject(Ablehnen) werden verwendet, um mit eMails basierend auf den Bedingungen zu interagieren.
Sieve-Erweiterungen:
- Require-Befehl: Mit
requirekönnen Sie bestimmte Sieve-Erweiterungen aktivieren, um erweiterte Funktionen wie das Hinzufügen von Flags, Ablehnen von eMails und mehr zu ermöglichen.
Bedingungen und Operatoren:
- Verschiedene Bedingungstypen: Sieve bietet Bedingungen für Absender, Empfänger, Header, Body und mehr.
- Logische Operatoren: Sie können
allof(UND),anyof(ODER) undnot(NICHT) verwenden, um komplexe Bedingungen zu erstellen.
Beispiele für Sieve-Anwendungen:
- Filtern von eMails: Sieve ermöglicht das Organisieren von eMails basierend auf verschiedenen Kriterien wie Absender, Betreff, Inhalt usw.
- Spam-Filter: Sieve kann dazu verwendet werden, Spam zu erkennen und zu filtern, indem bestimmte Bedingungen für verdächtige eMails festgelegt werden.
- Automatisches Ablehnen oder Markieren: Sieve kann so konfiguriert werden, dass eMails automatisch abgelehnt oder markiert werden, je nach den definierten Regeln.
Fazit
Sieve ist eine leistungsfähige und standardisierte Methode für die serverseitige Filterung von eMails. Die Syntax ermöglicht eine klare Definition von Regeln und Aktionen, um eMails automatisch zu organisieren und zu verarbeiten. Durch die Verwendung von require können erweiterte Funktionen aktiviert werden, um spezifische Anforderungen zu erfüllen. Es ist wichtig, die Dokumentation der jeweiligen Sieve-Implementierung zu konsultieren, um die verfügbaren Funktionen und Syntaxdetails zu verstehen. Insgesamt bietet Sieve eine effektive Möglichkeit, die eMail-Verwaltung zu automatisieren und individuelle Präferenzen anzupassen.
Quellen:
http://sieve.info
https://www.rfc-editor.org/rfc/rfc5228.html
https://www.rfc-editor.org/rfc/rfc5230.html
https://www.rfc-editor.org/rfc/rfc5788.html
https://www.rfc-editor.org/rfc/rfc3894.html
