Ich würde gerne folgenden SIEVE Code bei netcup eingeben:
require ["editheader", "variables", "regex", "relational", "comparator-i;ascii-numeric", "fileinto"];
# rule:[SPAM | Spamwert, ab dem der Betreff angepasst wird]
set "spamwert_subject" "10"; # 10 entspricht 1.0
# rule:[SPAM | Spamwert, ab dem die E-Mail in den Spam-Ordner verschoben wird]
set "spamwert_folder" "48"; # 10 entspricht 1.0
# rule:[SPAM | Initialisierung der Spam-Score Variablen]
set "spam_score" "0"; # Initialwert, falls kein gültiger Score gefunden wird
set "integer_part" "0"; # Ganzzahliger Teil
set "decimal_part" "0"; # Dezimalstellen
set "spam_score_with_decimal" "false"; # Kennzeichnung, ob Score Dezimalstellen hat
########################################
# EXTRAKTION DES SPAMWERTS AUS DEN HEADERN
########################################
# rule:[SPAM | Extraktion des Spamwerts aus X-Spam-Status mit Dezimalstellen]
if header :regex "X-Spam-Status" "score=(-?[0-9]+)\\.([0-9]+)" {
# Z.B. score=3.2 wird zu integer_part=3 und decimal_part=2
set "integer_part" "${1}";
set "decimal_part" "${2}";
set "spam_score" "${integer_part}${decimal_part}"; # z.B. 3 und 2 wird zu 32 oder -32
set "spam_score_with_decimal" "true"; # Kennzeichnung, dass der Wert mit Dezimalstellen ist
}
# rule:[SPAM | Extraktion des Spamwerts aus X-Spam-Status ohne Dezimalstellen]
if allof (header :regex "X-Spam-Status" "score=(-?[0-9]+)", not string :is "${spam_score_with_decimal}" "true") {
# Ganzzahliger Wert ohne Dezimalstellen
if not header :contains "X-Spam-Status" "\\." {
set "integer_part" "${1}";
set "spam_score" "${integer_part}0"; # 5 wird zu 50 oder -5 wird zu -50
set "decimal_part" "0"; # Dezimalteil ist 0
}
}
# rule:[SPAM | Extraktion des Spamwerts aus X-Spam-Level, wenn kein gültiger Wert in X-Spam-Status]
if string :is "${spam_score}" "0" {
if header :matches "X-Spam-Level" "*" {
set "decimal_part" "0"; # Initialisierung von decimal_part auf 0
if header :contains "X-Spam-Level" "*****" {
set "spam_score" "50";
set "integer_part" "5";
} elsif header :contains "X-Spam-Level" "****" {
set "spam_score" "40";
set "integer_part" "4";
} elsif header :contains "X-Spam-Level" "***" {
set "spam_score" "30";
set "integer_part" "3";
} elsif header :contains "X-Spam-Level" "**" {
set "spam_score" "20";
set "integer_part" "2";
} elsif header :contains "X-Spam-Level" "*" {
set "spam_score" "10";
set "integer_part" "1";
}
}
}
########################################
# VERARBEITUNG DES EXTRAHIERTEN SPAMWERTS
########################################
# rule:[SPAM | Abbruch bei leerem Spamwert]
if not header :matches "X-Spam-Level" "*" {
stop; # Script stoppen, da kein gültiger Spamwert
}
# rule:[SPAM | Betreff anpassen basierend auf gesammeltem Präfix]
if string :comparator "i;ascii-numeric" :value "ge" "${spam_score}" "${spamwert_subject}" {
# Betreff anpassen, wenn Spamwert >= Schwellenwert für den Betreff
deleteheader "Subject";
addheader "Subject" "[SPAM-${integer_part}.${decimal_part}] ${original_subject}";
}
# rule:[SPAM | Verschieben in den Spam-Ordner basierend auf Schwellenwert]
if string :comparator "i;ascii-numeric" :value "ge" "${spam_score}" "${spamwert_folder}" {
# E-Mail in den Spam-Ordner verschieben, wenn Spamwert >= Schwellenwert für den Spam-Ordner
fileinto "Spam";
}
Alles anzeigen
Das interessante ist:
1) Ich kann den Code abspeichern und erhalte eine positive Bestätigung, dass es keine Fehler gibt. ![]()
2) Der Code/die Filter funktionieren auch ganz exakt wie vorgesehen. ![]()
Aber netcup zeigt mir nur folgende 4 Regeln visuell an: ![]()
Angenommen ich bennene die Regel: #3 um in -> Regel 3 und #4 in -> Regel 4, dann erhalte ich folgenden (von netcup automatisch gekürzten) Code: ![]()
require ["regex","variables"];
set "spamwert_subject" "10";
set "spamwert_folder" "48";
set "spam_score" "0";
set "integer_part" "0";
set "decimal_part" "0";
set "spam_score_with_decimal" "false";
# rule:[SPAM | Extraktion des Spamwerts aus X-Spam-Status mit Dezimalstellen]
if header :regex "X-Spam-Status" "score=(-?[0-9]+)\\.([0-9]+)"
{
set "integer_part" "${1}";
set "decimal_part" "${2}";
set "spam_score" "${integer_part}${decimal_part}";
set "spam_score_with_decimal" "true";
}
# rule:[SPAM | Extraktion des Spamwerts aus X-Spam-Level, wenn kein gültiger Wert in X-Spam-Status]
if string :is "${spam_score}" "0"
{
set "spam_score" "30";
set "integer_part" "3";
stop;
}
# rule:[Regel 3]
if header :contains "x-spam-level" "**"
{
set "spam_score" "20";
set "integer_part" "2";
stop;
}
# rule:[Regel 4]
if header :contains "x-spam-level" "*"
{
set "spam_score" "10";
set "integer_part" "1";
}
Alles anzeigen
Netcup löscht hier 80% meines Codes.
Selbst
require ["editheader", "variables", "regex", "relational", "comparator-i;ascii-numeric", "fileinto"];
wird gekürzt zu:
require ["regex","variables"]; ![]()
Ich würde den Code einfach so lassen. Habe aber Angst, dass da in Zukunft was schief gehen kann oder es Probleme gibt, weil netcup den Code visuell nicht wirklich erkennt (obwohl er technisch gut funktioniert).
Was ist da der beste Plan?