Regex: Ist mein Sieve-Filter richtig?

CyborgBeta

Captain
Registriert
Jan. 2021
Beiträge
3.786
Guten Morgen. ☕

Also, ich nehme alle E-Mails von jedem Präfix entgegen. Bisher hatte ich auch gar keine Probleme (wegen Spam oder so).

Aber ich möchte das Ganze gerne mit einem Dovecot-Sieve-Filter etwas sortieren/ordnen.

Code:
require ["envelope", "fileinto", "mailbox", "subaddress", "variables", "imap4flags", "regex"];

if address :contains ["From"] ["wichtigePersonA"] {
  addflag "\\Flagged";
}

if address :regex "To" "([a-zA-Z0-9]+).*@" {
  set :lower :upperfirst "tag" "${1}";
 
  if address :is ["To"] "weiterleitungVon@outlook.de" {
    set "tag" "Outlook";
  } elsif address :contains ["To"] "postmaster" {
    set "tag" "Reports";
  } elsif address :contains ["From"] ["computerbase", "byte-welt"] {
    set "tag" "Forum";
  } elsif address :contains ["From"] "facebook" {
    set "tag" "Facebook";
  } elsif address :contains ["From"] "github" {
    set "tag" "Github";
  }
 
  set "tag" "Boxes.${tag}";
  if mailboxexists "${tag}" {
    fileinto "${tag}";
  } else {
    fileinto :create "${tag}";
  }
}

Es soll also für jedes Präfix ein Tag/Label/Folder angelegt werden.

Nun kann es ja passieren, dass jemand etwas an: alter.was.geht@adresse schreibt (... fast ein Fall schon für Reject :D). Dann würde er drei Unterordner anlegen: Boxes/Alter/Was/Geht ... Das macht natürlich gar keinen Sinn, deshalb die Frage, ob der RegEx "([a-zA-Z0-9]+).*@" richtig ist, also jeweils nur "den ersten Teil" des Präfixes wählt.
 
Du willst alles links vom @ Symbol haben?
Dann (.*?)@ oder so. Prüfs mit einem online Checker

Mach am besten mal Beispiele 😃
 
  • Gefällt mir
Reaktionen: madmax2010 und CyborgBeta
Tornhoof schrieb:
Du willst alles links vom @ Symbol haben?
Ja, aber nicht alles links vom @-Symbol ... Der . ist problematisch, weil dadurch mehrere Unterordner angelegt würden. Ich weiß noch nicht, wie damit umgehen soll.
 
Wenn du alles ab Punkt haben willst dann ggf sowas .*?\.(.?)@ \. escapes den Punkt
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: CyborgBeta
das geht schon da du den . ja nicht mit reingenommen hast in dem []

trotzdem wird dir das viele quatsch ordner erzeugen. im To kann ja alles mögliche stehen (und bei dir landet es wegen BCC oder sonstwas). und da hast du dann jedesmal neue ordner für

manche matches sind auch nicht scharf genug, ein computerbase@quatschdomain landet dann auch in deinem Forum ordner obwohl das mit computerbase. de nicht zu tun hat
 
  • Gefällt mir
Reaktionen: CyborgBeta
kieleich schrieb:
manche matches sind auch nicht scharf genug, ein computerbase@quatschdomain landet dann auch in deinem Forum ordner obwohl das mit computerbase. de nicht zu tun hat
Das stimmt, da wäre eine Prüfung des Hosts besser ... aber das würde mir ohnehin später auffallen.

kieleich schrieb:
trotzdem wird dir das viele quatsch ordner erzeugen. im To kann ja alles mögliche stehen (und bei dir landet es wegen BCC oder sonstwas). und da hast du dann jedesmal neue ordner für
Das ist eigentlich der Sinn der Sache, eine Art Adressen-Hierarchie zu haben. Aber stimmt natürlich, wenn meine E-Mail im (B)CC landet, dann sollte der CC eigentlich Vorrang haben.

Wäre es dann nicht besser, anstatt To: das Delivered-To: für die Regex-Prüfung zu nehmen?

Und kann ich aus einer Sieve-Variable (einem String) alle Zeichen entfernen, die nicht in [a-zA-Z0-9] sind?

Oder anders gefragt, welche Chars sind denn in E-Mail-Adressen im Allgemeinen zulässig?
Ergänzung ()

Ok, nun funktioniert es.

"Delivered-To" war keine gute Idee (diese ist immer gleich), aber "To" und "Cc" passen, wobei "To" Vorrang hat:

Code:
require ["envelope", "fileinto", "mailbox", "subaddress", "variables", "imap4flags", "regex"];

if address :contains ["From"] ["wichtigA", "wichtigB"] {
  addflag "\\Flagged";
}

if address :regex ["To", "Cc"] "([a-zA-Z0-9]+).*@abc.de" {
  set :lower :upperfirst "tag" "${1}";
 
  if address :contains ["To", "Cc"] "postmaster" {
    set "tag" "Reports";
  } elsif address :domain :contains ["From"] ["computerbase", "byte-welt"] {
    set "tag" "Forum";
  } elsif address :domain :contains ["From"] "facebook" {
    set "tag" "Facebook";
  } elsif address :domain :contains ["From"] "github" {
    set "tag" "Github";
  }
 
  set "tag" "Boxes.${tag}";
  if mailboxexists "${tag}" {
    fileinto "${tag}";
  } else {
    fileinto :create "${tag}";
  }
} elsif address :is ["To"] "ich@outlook.de" {
  fileinto :create "Boxes.Outlook";
}

Mit address :domain :contains wird dann nur auf die Domain geprüft ...

Btw. Über alle Zeichen einer Variable iterieren, ist damit leider nicht möglich ... wohl aus Gründen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: taucher65
Was ist hieran falsch?

Code:
  if address :contains ["From"] ["@idontlikeyou.io"] {
    reject "I do not wish to receive e-mails from you. Thank you for accepting this.";
    stop;
  }

Die E-Mail wird nicht zugestellt und erscheint nicht in der Inbox, aber der Sender erhält keinen 5yz-Fehler mit meinem Text als Antwort ...

https://datatracker.ietf.org/doc/html/rfc5429

Oder brauche ich "ereject"? Oder ist die Syntax falsch? Oder ist das Verhalten normal? Was geschieht das intern im Dovecot?
 
Zurück
Oben