[gelöst] Imap Sieve: Userscript um Nachrichten beim Verschieben in Ordner woanders hin verschieben

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

[gelöst] Imap Sieve: Userscript um Nachrichten beim Verschieben in Ordner woanders hin verschieben

Beitrag von reox » 22.10.2022 14:34:48

K9mail kann leider kein Archiv basierend auf Jahren/Moaten (https://github.com/thundernest/k-9/issues/900). Ich dachte mir, dass es eigentlich mit imap_sieve lösbar sein sollte, also k9mail die Nachricht einfach in den Archiv Ordner verschieben lassen, dann imap_sieve aufrufen und die Nachricht nach Archiv.YEAR verschieben.

Nun hab ich geschaut wie Imap sieve funktioniert und mir scheint man kann das nur systemweit einrichten und nicht in einem Userscript? Weil unter https://doc.dovecot.org/configuration_m ... figuration sehe ich, dass man diese imapsieve_mailboxN_{name,from} einrichten muss, um ein script dann zu starten wenn eine Nachricht verschoben wird. Ich finde nirgends eine Information wie man das in einem Script abfragen soll...
Hier wird angedeutet, dass es so ist und quasi nur administrative aufgaben damit gemacht werden sollen: https://dovecot.org/pipermail/dovecot/2 ... 17251.html
dH der einzige Workaround wäre es Systemweit zu konfigurieren aber dann auf meinen IMAP user filtern? Oder übersehe ich gerade etwas?
Zuletzt geändert von reox am 28.10.2022 08:22:23, insgesamt 1-mal geändert.

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Imap Sieve: Userscript um Nachrichten beim Verschieben in Ordner woanders hin verschieben

Beitrag von reox » 23.10.2022 12:40:09

Hab ein wenig im RFC6785 gelesen und ich hab den Eindruck es geht wirklich nicht.

Ich hatte mir ein script zusammengebastelt:

Code: Alles auswählen

require ["imapsieve", "environment", "date", "fileinto", "mailbox"];
# Rule for imapsieve, move messages from Archives to Archives.YEAR
if anyof (environment :is "imap.cause" "APPEND", environment :is "imap.cause" "COPY") {
  if environment :is "imap.mailbox" "Archives" {
    # FIXME: currentdate is the date right now and not the date of the message received!
    if currentdate :matches "year" "*" { set "year" "${1}"; }
    fileinto :create "Archives.${year}";
    stop;
  }
}
Aber da gibts ein paar probleme: das script wird beim verschieben von Nachrichten grundsätzlich nicht ausgeführt. Und dann noch ein paar kleinigkeiten zB das ich nicht so einfach auf den received header zugreifen kann (vermutlich müsste man das jahr per regex holen?).
Allerdings, selbst wenn ich es irgendwie so konfigurieren könnte, dass es ausgeführt wird (oder ist das wirklich eine client sache?) dann scheint mir, es würde trotzdem nicht gehen.
Denn der RFC verbietet offenbar, die Mailbox zu ändern, für die eine Nachricht gefiltert wird: https://www.rfc-editor.org/rfc/rfc6785#section-7.3.2
The value of this item is fixed when the script begins, and, in particular, MUST NOT change as a result of any action, such as "fileinto".
Aber das heißt ja auch, ich kann einen Filter generell vergessen der sowas macht, weil ich "imap.mailbox" nicht ändern darf?
Zuletzt geändert von reox am 23.10.2022 12:49:19, insgesamt 1-mal geändert.

hec_tech
Beiträge: 1093
Registriert: 28.06.2007 21:49:36
Wohnort: Wien
Kontaktdaten:

Re: Imap Sieve: Userscript um Nachrichten beim Verschieben in Ordner woanders hin verschieben

Beitrag von hec_tech » 23.10.2022 12:48:51

Die Copy Funktion wird ja bei RSPAMD für Learn Spam und Ham verwendet.

Damit müsstest du genau das erreichen können was du willst.

Beispiel findest du hier: https://www.kernel-error.de/2020/05/04/ ... imapsieve/

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Imap Sieve: Userscript um Nachrichten beim Verschieben in Ordner woanders hin verschieben

Beitrag von reox » 23.10.2022 12:51:40

hec_tech hat geschrieben: ↑ zum Beitrag ↑
23.10.2022 12:48:51
Die Copy Funktion wird ja bei RSPAMD für Learn Spam und Ham verwendet.

Damit müsstest du genau das erreichen können was du willst.

Beispiel findest du hier: https://www.kernel-error.de/2020/05/04/ ... imapsieve/
Ja, die Scripte sind ja auch in der Dovecot Doku selber verlinkt. Aber sie sind eben Serverweit eingerichtet. Ich will aber nicht, dass es bei jedem so ist, sondern lediglich bei mir.
Weiters erstellt copy eine Kopie, aber ich möchte das verschieben ja komplett umleiten - wo ich mittlerweile denke, dass es gar nicht funktioniert, weil vom RFC so nicht spezifiziert.

hec_tech
Beiträge: 1093
Registriert: 28.06.2007 21:49:36
Wohnort: Wien
Kontaktdaten:

Re: Imap Sieve: Userscript um Nachrichten beim Verschieben in Ordner woanders hin verschieben

Beitrag von hec_tech » 23.10.2022 15:35:54

Sollen nur bestimmte Mails oder alle Mails im Archiv landen?

Ich arbeite generell nur mit Sieve somit habe ich das direkt im Script eingebaut.

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Imap Sieve: Userscript um Nachrichten beim Verschieben in Ordner woanders hin verschieben

Beitrag von reox » 23.10.2022 20:26:59

Ziel soll sein, dass wenn ich eine Mail von irgendeinem Ordner nach "Archives" verschiebe, die Mail stattdessen in "Archives.YEAR" landet.
Ich will die Funktionalität von Thunderbird und co ebenfalls in K9-mail abbilden können - nur halt Serverseitig.

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Imap Sieve: Userscript um Nachrichten beim Verschieben in Ordner woanders hin verschieben

Beitrag von reox » 28.10.2022 08:22:04

Ok, ich habs hinbekommen.
Dazu musste man ein paar Dinge einstellen:

1) IMAP METADATA aktivieren https://doc.dovecot.org/configuration_m ... _metadata/
2) die imapsieve_url setzen, zB auf sieve://localhost:4190 (Ich glaube das ist nur kosmetisch und skripte würden sonst auch ausgeführt aber bin mir da nicht so sicher...)
3) imapsieve aktivieren https://doc.dovecot.org/configuration_m ... imapsieve/

Dann loggt man sich per openssl client auf dem IMAP server ein und setzt dort die metadaten für die jeweilige mailbox.
Beim login sollte man die capabilities checken ob dort METADATA und IMAPSIEVE auftaucht.
Der Scriptname muss dem Dateinamen innerhalb des sieve verzeichnisses entsprechen (siehe einstellung `sieve`, ich hab das zB auf `sieve = file:~/sieve;active=~/.dovecot.sieve`) und ohne die extension .sieve sein:

Code: Alles auswählen

$ openssl s_client -crlf -connect  localhost:993
[...]
a login <username> <password>
a OK [CAPABILITY ... METADATA ... IMAPSIEVE=sieve://localhost:4190] Logged in
[...]
a SETMETADATA Archives (/shared/imapsieve/script "archives")
[...]
a logout
Mein script zum verschieben war sogar komplett richtig, es fehlte lediglich das modul variables. Den Check auf das Environment kann man noch rausnehmen, da es eh mailbox spezifisch ist:

Code: Alles auswählen

require ["imapsieve", "environment", "date", "fileinto", "mailbox", "variables"];
# Rule for imapsieve, move messages from Archives to Archives.YEAR
if anyof (environment :is "imap.cause" "APPEND", environment :is "imap.cause" "COPY") {
    # FIXME: currentdate is the date right now and not the date of the message received!
    if currentdate :matches "year" "*" { set "year" "${1}"; }
    fileinto :create "Archives.${year}";
    stop;
}
Lediglich könnte man jetzt noch ändern, dass das Empfangsdatum der Nachricht verwendet wird, aber ich versteh nicht wie das gehen soll...

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] Imap Sieve: Userscript um Nachrichten beim Verschieben in Ordner woanders hin verschieben

Beitrag von reox » 29.10.2022 15:37:40

Noch ein Nachtrag:

Code: Alles auswählen

require ["imapsieve", "environment", "date", "fileinto", "mailbox", "variables"];
if anyof (environment :is "imap.cause" "APPEND", environment :is "imap.cause" "COPY") {
    if date :matches "received" "year" "*" { 
    	fileinto :create "Archives.${1}";
    	stop;
    }
    # Keine Ahnung ob das passieren kann - aber als Fallback wird sonst das current date verwendet.
    if currentdate :matches "year" "*" {
    	fileinto :create "Archives.${1}";
    	stop;
   }
}
So wird der header ausgelesen und die Nachricht auch dann richtig archiviert, wenn nicht zufällig das selbe jahr ist.

Antworten