Bei der Nutzung von SIEVE-Regeln im netcup Webmailer sind mir einige (teils sehr ärgerliche) Bugs aufgefallen, die ich hier auflisten will.
Eine Ergänzung der Liste (oder natürlich auch eine Korrektur/Lösung) ist gerne willkommen.
Der Support von netcup selbst meint aber, dass bereits einige bugs bekannt seien und die Webmailer-Version in absehbarer Zeit aktualisiert werden soll.
Dennoch im Folgenden eine Auflistung mir bekannter Fehler:
# FEHLER 1 - Kommentare
Kommentare werden gelöscht:
wird zu:
# FEHLER 2 - if-Verschatelungen
Keine verschachtelten if-Bedingungen (und auch keine elsif und else)
require ["fileinto"];
# rule:[Eine Regel, die E-Mails in Abhängigkeit vom Betreff und Absender-Domain sortiert.]
if header :contains "subject" "test" {
if address :domain :is "from" "example.com" {
fileinto "INBOX.Example";
} elsif address :domain :is "from" "test.com" {
fileinto "INBOX.Test";
} else {
fileinto "INBOX.Other";
}
}
Display More
wird zu:
require ["fileinto"];
# rule:[Eine Regel, die E-Mails in Abhängigkeit vom Betreff und Absender-Domain sortiert.]
if header :contains "subject" "test"
{
fileinto "INBOX.Test";
}
# FEHLER 3 - Variablensetzung
Bei Sieve können Variablen so gesetzt werden:
require ["fileinto","variables"];
# rule:[Neue Variablen]
set "variable_a" "100";
# rule:[Bedingung]
if string :is "variable_a" "100"
{
fileinto "INBOX";
}
Dies funktioniert auch bei netcup, wenn man es im Code so macht und dann auf den visuellen Editor rüberwechselt.
Aber im visuellen Editor selbst, kann man Variablen nur wie folgt definieren:
require ["fileinto","variables"];
# rule:[Neue Variablen]
if true
{
set "variable_a" "100";
}
# rule:[Bedingung]
if string :is "variable_a" "100"
{
fileinto "INBOX";
}
Display More
# FEHLER 4 - Variablennutzung
Manchmal können Variablen nicht in einem numerischen Vergleich verwendet werden, wie z.B. bei der Überprüfung eines Spam-Scores. Hier ein Beispiel, wie es normalerweise nicht funktioniert:
require ["editheader", "variables", "relational", "comparator-i;ascii-numeric"];
set "spamscore_subject" "2";
set "spam_score" "5";
# rule:[Überprüfe, ob der Spam-Score größer oder gleich dem gewünschten Wert ist]
if string :value "ge" :comparator "i;ascii-numeric" "${spam_score}" "${spamscore_subject}"
{
deleteheader :contains "Subject";
addheader "Subject" "Spam-Score überschritten";
}
Display More
Hier ergibt der visuelle SIEVE-Editor bei netcup folgende Fehlermeldung zu ${spamscore_subject}:
Unzulässige Zeichen im Eingabefeld
Hier sollten aber Variablen (die einen Zahlenwert enthalten) erlaubt sein.
# FEHLER 5 - i;ascii-numeric
require ["comparator-i;ascii-numeric"] und :comparator "i;ascii-numeric" funktionieren zwar und werden beim Speichern auch nicht gelöscht:
require ["comparator-i;ascii-numeric","editheader","relational","variables"];
# rule:[Einfacher Vergleich]
if string :value "gt" :comparator "i;ascii-numeric" "10" "9"
{
addheader "Subject" "10 is bigger than 9";
}
Das bleibt so. Aber im visuellen Editor gibt es keine Möglichkeit "i;ascii-numeric" auszuwählen, sondern der erzeugte code würde so aussehen:
require ["editheader","relational","variables"];
# rule:[Einfacher Vergleich]
if string :value "gt" "10" "9"
{
addheader "Subject" "10 is bigger than 9";
}
Da die 1 aber vor der 9 kommt, würde es in diesem Beispiel nicht funktionieren.
Man benötigt also eine Auswahlmöglichkeit für "i;ascii-numeric" (was man aber derzeit auch im Code manuell hinzufügen kann).
# FEHLER 6 - i;ascii-casemap
Im Gegensatz zu require ["comparator-i;ascii-numeric"] (was bei netcup vorhanden ist und funktioniert), gibt es bei require ["comparator-i;ascii-casemap"] leider mehr Probleme.
i;ascii-casemap funktioniert zwar, wenn man nur im Code-Editor bleibt:
require ["comparator-i;ascii-casemap","editheader","variables"];
set "email1" "abc@abc.de";
set "email2" "ABC@abc.de";
# rule:[Test]
if string :comparator "i;ascii-casemap" :is "${email1}" "${email2}"
{
addheader "Subject" "HAT GEKLAPPT";
}
Ergebnis: "HAT GEKLAPPT"
Aber wenn man im visuellen Editor auf speichern klickt, werden require ["comparator-i;ascii-casemap"] und i;ascii-casemap komplett aus dem Code entfernt:
require ["editheader","variables"];
set "email1" "abc@abc.de";
set "email2" "ABC@abc.de";
# rule:[Test]
if string :is "${email1}" "${email2}"
{
addheader "Subject" "HAT GEKLAPPT";
}
Ergebnis ist hier leider nicht: "HAT GEKLAPPT"
Merkwürdig dagegen ist folgendes Verhalten:
require ["editheader"];
# rule:[Betreff: important]
if header :contains "Subject" "important"
{
addheader "Subject" "HAT GEKLAPPT";
}
Wie im letzten Code-Beispiel haben wir hier kein i;ascii-casemap. Wenn ich jetzt eine E-Mail mit dem Betreff "IMPORTant" schreibe, sollte der Betreff ja nicht geändert werden, weil "IMPORTant" ≠ "important" und i;ascii-casemap ist nicht aktiv.
Ergebnis: "HAT GEKLAPPT" (was nicht so sein sollte)
Es gibt zwar eine Auswahlmöglichkeit im visuellen Sieve-Editor... aber da require ["comparator-i;ascii-numeric"] nicht gespeichert wird, kann es auch nicht angewendet werden werden.
Anderes Beispiel in dem ich numerisch (ascii-numeric) auswähle:
require ["comparator-i;ascii-numeric","editheader","relational"];
# rule:[Kopfzeile von Nachricht entfernen]
if true
{
deleteheader :is :comparator "i;ascii-numeric" "Subject" "100";
}
Hier konnte ich "i;ascii-numeric" auswählen aus der folgenden Liste:
- Vorgabewert
- strikt (Oktett)
- Groß-/Kleinschreibung ignorieren
- numerisch (ascii-numeric)
aber wenn ich Groß-/Kleinschreibung ignorieren auswähle, wird dies nicht angewendet:
require ["editheader"];
# rule:[Kopfzeile von Nachricht entfernen]
if true
{
deleteheader :is "Subject" "100";
}
# FEHLER 7 - Erlaubte Variablenzeichen
Beispiel:
Hier wurde set "variable_c" "a<b" automatisch zu set "variable_c" "a".
Das ist relevant, wenn man z.B. Variablen für regex abspeichern möchte.
# FEHLER 8 - regex
Das regex bei netcup unterstützt scheinbar kein Lookahead ((?=...)) und Lookbehind ((?<=...)).
Beispiele:
if header :regex "subject" "\\w+(?=@gmail\\.com)"
# Lookahead ((?=...))
# \w+(?=@gmail\.com)
# Eingabe: benutzername@gmail.com user@yahoo.com test@gmail.com
# Ergebnis: benutzername, test
if header :regex "subject" "\\w+(?!@gmail\\.com)"
# Negative Lookahead ((?!...))
# \w+(?!@gmail\.com)
# Eingabe: benutzername@gmail.com user@yahoo.com test@hotmail.com
# Ergebnis: user, test
if header :regex "subject" "(?<=€)\\d+"
# Lookbehind ((?<=...))
# (?<=€)\d+
# Eingabe: Die Preise sind €30, $40 und €50 pro Stück.
# Ergebnis: 30, 50
if header :regex "subject" "(?<!Mr\\.\\s)\\w+"
# Negative Lookbehind ((?<!...))
# (?<!Mr\.\s)\w+
# Eingabe: Mr. Smith and Ms. Johnson are here.
# Ergebnis: Ms., Johnson, and, are, here
Display More
Ich hoffe, dass das für Kunden und für netcup hilfreich ist