E-Mail: Sieve-Filter
Sieve ist eine domänenspezifische Sprache, die zum Konfigurieren von Mailfiltern auf Mailservern durch Benutzer konzipiert wurde. Sieve ist spezifiziert worden, um Nutzern die Möglichkeit zu geben, auf einfache Art eigene Regeln zur Filterung 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.
http://de.wikipedia.org/wiki/Sieve
Der Hauptvorteil von Sieve-Filtern ggü. von Filtern z.B. im Thunderbird ist dass die Filter bereits auf dem Mailserver selbst ausgeführt werden und somit unabhängig vom Mailclient ausgeführt werden. Es ist also egal mit welchem Programm die Mails abgerufen werden, die Filter funktionieren immer gleich.
Die Filter werden in der Reihenfolge abgearbeitet in der sie im Script aufgeführt sind. Soll nach einer Regel keine weitere Regel mehr angewendet werden so kann die Regel mit stop();
beendet werden.## Sieve for Thunderbird ##
Für Thunderbird steht unter https://addons.mozilla.org/de/thunderbird/addon/sieve/ ein Addon bereit, mit dessen Hilfe Sieve-Filter auf dem Server eingerichtet werden können. Diese funktionieren dann für alle anderen Mailclients ebenso. Das Addon besteht aus einem Editor, der auch eine Syntaxprüfung durchführt und ggf. Hilfestellung bei der Fehlerbehebung bietet.
Um die definierten Filter testen zu können muss auf eine entsprechende Mail gewartet werden, bestenfalls sollte man also mit Filtern beginnen deren Regeln man selbst abbilden kann.
Neben Sieve for Thunderbird stellt auch [[user:docs:webmail|Roundcube]] ein Interface zur Erstellung und Pflege von Sieve-Filtern zur Verfügung.## Beispiele ##
require "body";
if allof ( header :contains "subject" "WPKG Report", body :contains "ERROR" ) {
addflag "$label1";
}
Enthält die Mail den Betreff WPKG Report
und kommt im Text der Mail das Wort ERROR
vor wird die Mail rot ($label1
) markiert.```sieve
require "fileinto";
if header :contains "X-Spam-Flag" "YES" { fileinto "Junk"; }
Enthält die Mail den Header `X-Spam-Flag` mit dem Wert `YES` wird die Mail in den `Junk`-Ordner verschoben. Damit das Verschieben funktioniert ist die Funktion `fileinto` einzubinden, dies geschieht über `require "fileinto` (die Funktion muss pro Sievefilterdatei nur einmal eingebunden werden, daher fehlt die Angabe in den folgenden Beispielen).```sieve
require "imap4flags";
require "regex";
if header :regex ["subject"] ["Cron.*(failed)"] {
addflag "$label1";
}
Enthält die Mail den Header subject
(Betreff) mit dem Wert Cron[beliebige Zeichenfolge](failed)
wird sie rot
($label1) markiert. Hierzu sind die Funktionen regex
(:regex
) und imap4flags
(addflag
) einzubinden.```sieve
if header :contains ["subject"] ["backup success"] {
addflag "$label3";
} elsif header :contains ["subject"] ["BACKUP ERROR",
"BACKUP FAILURE"] {
addflag "$label1";
redirect "nhaagen@21x9.sh";
}
Enthält die Mail den Header `subject` und kommt dort die Zeichenkette `backup success` vor wird sie `grün` ($label3) markiert. Enthält die Mail im Betreff die Zeichenkette `BACKUP ERROR`, oder `BACKUP FAILURE` wird die Mail `rot` markiert und an `nhaagen@21x9.sh` weitergeleitet (`redirect`). Redirect ist hier etwas verwirrend, da die Mail nicht umgeleitet, sondern als Kopie an den zusätzlichen Empfänger geschickt, wird.```sieve
if allof ( header :contains "from" "user.name", header :contains "subject" "Mittagessen", header :contains "to" "all@21x9.sh" ) {
fileinto "INBOX.Essen";
stop;
}
Ein Beispiel für eine AND-Verknüpfung einer IF-Abfrage. Enthält die Mail den Header from
und kommt dort die Zeichenkette user.name
vor UND der Header subject
enthält die Zeichenkette Mittagessen
UND der Header to
enthält den Wert all@21x9.sh
wird die Mail in den Ordner INBOX.Essen
verschoben.
Wichtig: Die entsprechenden Ordner müssen zuvor manuell angelegt und abonniert werden.```sieve if header :contains "To" "root" { fileinto "INBOX.System"; }
Geht (`to`) die Mail an den Empfänger `root` (auch root@21x9.sh, root@21x9.org, etc.) wird sie in den Ordner `INBOX.System` verschoben.```sieve
if address :is "from" "MAILER-DAEMON@mx0.21x9.org" {
fileinto "INBOX.mailstatus";
stop;
}
Kommt (from
) die Mail vom Absender MAILER-DAEMON@mx0.21x9.org
wird sie in den Ordner INBOX.mailstatus
verschoben.```sieve
if header :contains "Return-path" "bounce-debian-user=gpvkt=21x9.org@lists.debian.org" {
fileinto "INBOX.Debian";
stop;
}
if header :contains "Return-path" "samba-bounces@lists.samba.org" {
fileinto "INBOX.Samba";
stop;
}
if header :contains "Return-path" "openldap-technical-bounces@openldap.org" {
fileinto "INBOX.OpenLDAP";
stop;
}
if header :contains "Return-path" "owner-postfix-users@postfix.org" {
fileinto "INBOX.PostFix";
stop;
}
if header :contains "Return-path" "wpkg-users-bounces@lists.wpkg.org" {
fileinto "INBOX.wpkg";
stop;
}
Beispiele für die Sortierung von Mails von Mailinglisten, diese haben oft verschiedene Empfänger aber immer einen eindeutigen `Return-Path`.```sieve
if header :contains "X-Powered-BY" "OTRS - Open Ticket Request System" {
fileinto "INBOX.Tickets";
}
if header :contains "From" "Mantis Bug Tracker" {
fileinto "INBOX.Tracker";
}
Beispiel für das Verschieben von Nachrichten des Ticket-Systems und des Bugtrackers.```sieve if anyof ( not address :all :contains ["To", "Cc", "Bcc"] ["gpvkt@21x9.sh", "gpvkt@21x9.org", "42@21x9.sh", "42@21x9.org", "23@21x9.sh", "23@21x9.org", "info@21x9.sh", "info@21x9.org"] ) { fileinto "Junk"; }
Wenn eine Mail eingeht, die weder im `To`, `Cc` noch im `Bcc` Feld (`anyof`) eine der angegebenen Mailadressen enthält, wird sie in den Ordner `Junk` verschoben. Dies trifft z.B. für eine Vielzahl von Newslettern zu.
Wichtig: Ein solcher Filter sollte nur mit größter Vorsicht eingesetzt werden.Mit Sieve sind auch Abwesenheitsnachrichten möglich. Entsprechende Regeln sollten immer am Ende des Scripts ausgeführt werden, so kann z.B. Verhindert werden, dass Autoreplys an Mailinglisten versendet werden (wenn diese bereits zuvor mit einer stop();-Regel behandelt wurden):
```sieve
vacation
# Reply at most once a day to a same sender
:days 7
:subject "Out of office reply"
# List of additional recipient addresses which are included in the auto replying.
# If a mail's recipient is not the envelope recipient and it's not on this list,
# no vacation reply is sent for it.
:addresses ["42@21x9.org", "42@21x9.sh", "23@21x9.org", "23@21x9.sh", "gpvkt@21x9.org", "gpvkt@21x9.sh"]
"Sehr geehrte Damen und Herren,
leider kann ich Ihre Nachricht derzeit nicht selbst beantworten. Ich werde am 21.09. wieder im Büro sein.
In dringenden Fällen wenden Sie sich bitte an Tom Loewen (tom.loewen@21x9.org) oder versuchen Sie es telefonisch.
Vielen Dank!
Mit freundlichen Grüßen
gpvkt
---------------------------------------------";