Auflistung bekannter Probleme / Bugs - mit SIEVE - im netcup Webmailer

  • 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:

    Code
    require [...];
    #Kommentar
    # rule:[a]
    ...

    wird zu:

    Code
    require [...];
    # rule:[a]
    ...




    # FEHLER 2 - if-Verschatelungen


    Keine verschachtelten if-Bedingungen (und auch keine elsif und else)

    wird zu:

    Code
    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:

    Code
    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:




    # 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:


    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:


    Code
    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:

    Code
    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:

    Code
    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:

    Code
    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:

    Code
    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:

    Code
    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:

    Code
    require ["editheader"];
    # rule:[Kopfzeile von Nachricht entfernen]
    if true
    {
        deleteheader :is "Subject" "100";
    }




    # FEHLER 7 - Erlaubte Variablenzeichen


    Beispiel:

    Code
    require ["variables"];
    
    # rule:[Variable mit a<b]
    if true
    {
        set "variable_c" "a";
    }

    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:


    Ich hoffe, dass das für Kunden und für netcup hilfreich ist :)

  • Ergänzen möchte ich noch:


    # FEHLER 9 - Leere Variablen (und Vergleiche)


    Beispiele:

    Code
    if string :is "${variable1}" ""
    {
        set :length "variable2" "";
    }

    In beiden Fällen erhalte ich: Eingabefeld darf nicht leer sein.

    Das wäre aber nach RFC 5229 durchaus zulässig:

    "empty String" sind also durchaus erlaubt, die dann einen :count von 0 ergeben würden.

    Auch hier steht:

    In RFC 5229 ist lediglich <value: string> vorgegeben. Es gibt keine Erwähnung, dass der String nicht leer "" sein darf.


    Für if string :is "${variable}" "" gibt es aber ein Workaround:

    if string :regex "${variable}" "^$"