PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sieve Filter funktioniert einfach nicht



pixel
30.09.04, 22:38
Hi@all,

ich möchte mit Sieve die ankommenden Mails verteilen. Hierzu wollte ich zunächst einmal ganz einfach vorgenen.

Ich habe am Cyrus die beiden User:

user.sven
user.sammelbox

Die Mails werden durch fetchmail alle dem User Sammelbox zugestellt. Solange kein Skript läuft funktioniert das auch. Nun sollen alle eintreffenden Mails die an sven Adressiert sind und die im to= haben in die Box sven.INBOX umgeleitet werden. Also zu einem anderen User.

So der User 'sammelbox' gehört zur Gruppe 'sysuser' und diese wiederum hat alle Rechte auf die Box user.sven

Ein lm am cyrus ziegt die Boxen wie folgt:

[...]
user.sammelbox (\HasNoChildren)
user.simone (\HasNoChildren)
[...]

Was mir hier auffällt das ich den Ordner INBOX gar nicht sehe?

Nun habe ich als USer sammelbox folgendes Skript aktiviert:

require "fileinto";
if header :contains ["to"] "sven*" {
fileinto "sven.INBOX";
}

Sobald dies aktiv ist landen die Mails nichtmehr in der Inbox von Sammelbox aber kommen in der Inbox von Sven auch nicht an. Das Skript scheint zu wirken jedoch scheint das Ziel falsch zu sein.

Wo habe ich den Fehler gemacht?

Viele Grüße
pixel

Roger Wilco
01.10.04, 00:57
Wo habe ich den Fehler gemacht?
Stimmen die Zugriffsrechte? Die ACLs können bei Cyrus IMAPd manchmal ganz schön hinterhältig sein. Damit "sammelbox" in "user.Sven" schreiben kann, müssen die notwendigen Rechte erst erteilt werden oder user.Sven muss für alle beschreibbar sein.

pixel
01.10.04, 01:30
Hi@all,

um den Fehler besser eingrenzen zu können habe ich den Fall so einfach wie möglich gemacht. User sammelbox holt die Box ab und die Mails landen in seiner Inbox. In dieser Inbox habe ich einen Ordner test angelegt. Nun sollen alles Mails die an sammelbox@..... addressiert sind in diesen Ordner test verschoben werden. Selbst das klappt nicht. Ich kapier es einfach nicht.

Viele Grüße
pixel

pixel
01.10.04, 11:36
Hi@all,

hier nocheinmal wie ich nun versuche zu filtern ...

Also folgende Situation. Ich habe auf dem System einen User 'sammelbox' angelegt. Dieser hat im IMAP auch eine Mailbox (user.sammelbox) und man kann sich mit dem Mail-Programm auf diesen Account anmelden.

Die Mails hole ich nun mit folgender fetchmail-Konfiguration ab:


poll "pop3.dreampixel.de" protocol POP3 : user "@dreampixel.de" there with password "geheim" is "sammelbox" here ;

Soweit kein Problem. Wenn ich die Mails 'fetche' landen sie in der INBOX vom USer sammelbox. Nun habe ich als User 'sammelbox' in der Inbox ein Unterverzeichnis 'test' erstellt. Wenn ich mir das im cyrusadm anschaue ist das auch richtig:

[...]
user.sammelbox (\HasChildren)
user.sammelbox.test (\HasNoChildren)
[...]

Zum testen wollte ich nun einen Sieve-Filter erstellen welcher alle Mails die an den User 'sammelbox*' addressiert sind, also im ersten Adressteil das Wort 'sammelbox' enthalten in das Unterverzeichnis test verschoben werden. Das ist nur ein Testbeispiel um mich damit vertraut zu machen. Ich weiß das dieser Filter wenig Sinn ergibt!

Also habe ich mir folgendes Filterskript erstellt:


require "fileinto";
if header :contains ["To"] "sammelbox*" {
fileinto "INBOX.test";
}

Dies habe ich im Verzeichnis /var/lib/sieve als Datei 'sammelbox.dat' gespeichert. Kurze Zwischenfrage. Für was sind die ganzen Unterverzeichnisse (a - z) im Verzeichnis ../sieve ?

Anschließend habe ich die Sieveshell als User 'sammelbox' gestartet und das file mit:

punt sammelbox.dat sammelbox

hochgeladen. Zu guter letzt habe ich es mit:

activate sammelbox

aktiviert und mit 'list' kontrolliert ob es aktiv ist. Nur funktionieren tut es nicht. Was habe ich falsch gemacht?

Viele Grüße
pixel

Jasper
01.10.04, 18:00
require "fileinto";
if header :contains ["To"] "sammelbox*" {
fileinto "INBOX.test";
}


:constains matcht substrings. verwende ":match"

oder verwende gleich

if address :localpart :is "to" "sammelbox" {
...
}

siehe RFC3028

-j

pixel
01.10.04, 20:25
Hi,

ich bin wie folgt vorgegangen. Habe das Skript in der Sieveshell gelöscht und es anschließend wie folgt geändert:


require "fileinto";
if address :localpart :is "to" "sammelbox" {
fileinto "INBOX.test";
}
Anschließend habe ich das Skript wieder in die Sieveshell geladen und aktiviert. Eine Testmail von extern wurde ist nach dem fetchmail jedoch in der Inbox des Users sammelbox gelandet. Wie wenn der Filter nicht wirken würden.

Kann es etwas dait zu tun haben das der User Sammelbox vie /etc/aliases als Postmaster definiert ist. Die relevanten Stellen:

root: sammelbox
postmaster: root

Hier noch der Header der Testmail nachdem sie abgerufen wurde. evtl. bringt uns das weiter:

Return-Path: <sven@dreampixel.de>
Received: from postgirl.dreampixel ([unix socket])
by postgirl (Cyrus v2.2.3) with LMTP; Fri, 01 Oct 2004 20:44:16 +0200
X-Sieve: CMU Sieve 2.2
Received: from localhost (localhost [127.0.0.1])
by postgirl.dreampixel (Postfix) with ESMTP id 903AA821F5E
for <sammelbox@localhost>; Fri, 1 Oct 2004 20:44:16 +0200 (CEST)
X-Original-To: sammelbox@dreampixel.de
Delivered-To: sammelbox@dreampixel.de
Received: from pop3.dreampixel.de [193.178.169.58]
by localhost with POP3 (fetchmail-6.2.5)
for sammelbox@localhost (single-drop); Fri, 01 Oct 2004 20:44:16 +0200 (CEST)
Received: from localhost (localhost [127.0.0.1])
by mail2.srv.syswebcom.net (Postfix) with ESMTP id A79491D9DD1
for <sammelbox@dreampixel.de>; Fri, 1 Oct 2004 20:15:17 +0200 (CEST)
Received: from mail2.srv.syswebcom.net ([127.0.0.1])
by localhost (mail2 [127.0.0.1]) (amavisd-new, port 10024) with ESMTP
id 15523-09 for <sammelbox@dreampixel.de>;
Fri, 1 Oct 2004 20:15:17 +0200 (CEST)
Received: from poseidon.dreampixel (pD9547658.dip.t-dialin.net [217.84.118.88])
by mail2.srv.syswebcom.net (Postfix) with ESMTP id 6A1711D998F
for <sammelbox@dreampixel.de>; Fri, 1 Oct 2004 20:15:15 +0200 (CEST)
From: Sven Gehr <sven@dreampixel.de>
Reply-To: sven@dreampixel.de
Organization: dreampixel
To: sammelbox@dreampixel.de
Subject: test 32
Date: Fri, 1 Oct 2004 20:46:15 +0200
User-Agent: KMail/1.5.4
MIME-Version: 1.0
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Message-Id: <200410012046.15080.sven@dreampixel.de>
X-Virus-Scanned: by amavisd-new at mail2.srv.syswebcom.net
X-UID: 45

Viele Grüße
pixel

Jasper
01.10.04, 21:54
lass das INBOX weg. der zielfolder ist relativ zu INBOX.


-j

pixel
03.10.04, 00:57
Hi,

super. Jetzt klappt zumindest mal diese einfache Filterung. Bevor ich mich nun an weitere Experimente mache hätte ich noch eine kleine Frage:

Ist es notwendig nach jeder Änderung im Skriptfile es zunächst in der sieveshell zu löschen, es zu ändern und anschließend wieder hochzuladen und zu aktivieren? Oder genügt es das eigentliche Skript-File zu ändern?

Viele Grüße
pixel

Jasper
03.10.04, 09:42
Ist es notwendig nach jeder Änderung im Skriptfile es zunächst in der sieveshell zu löschen, es zu ändern und anschließend wieder hochzuladen und zu aktivieren? Oder genügt es das eigentliche Skript-File zu ändern?


das skript kann irgendwo liegen, z.b. in $HOME des jeweiligen benutzers. es reicht, einfach mit put das bestehende zu überschreiben. beim hochladen wird es geprüft, kompiliert und, wenn vorher schon aktiviert, auch wieder aktiviert.
auf fileebene sieht das dann so aus (version 2.2.8):

# pwd
/var/lib/imap/sieve/d/dummy
# ls -la
total 16
drwx------ 2 cyrus mail 4096 Oct 1 21:54 .
drwxr-x--- 3 cyrus mail 4096 Jan 9 2004 ..
lrwxrwxrwx 1 cyrus mail 20 Feb 23 2004 defaultbc -> imap-filterregeln.bc
-rw------- 1 cyrus mail 2292 Oct 1 21:54 imap-filterregeln.bc
-rw------- 1 cyrus mail 1665 Oct 1 21:54 imap-filterregeln.script

*.script ist ascii um mit get das skript anzeigen/herunterladen zu können, *.bc ist das compilat. aber immer das masterskript in z.b. $HOME ändern und hochladen, nicht das skript *.script ändern.


-j

pixel
04.10.04, 16:42
ok, auch das funktioniert nun. Schonmal vielen Dank. Jetzt müßte ich dich noch mit einer Frage Quälen dann denke komme ich mit dem Rest alleine durch ;)

Das fetchen der Mails passiert ja mit dem User Sammelbox und das Sieve-Filterskript erfolgt ebenfalls damit. Nun möchte ich alle E-Mails die als Ziel-Adresse "suse-linux@" enthalten in einen Shared-Folder welcher im cyradm als archiv.unverteilt angezeigt wird leiten. Wie würde die Filterregel dann aussehen. Etwas so:


require "fileinto";
if address :localpart :is "to" "suse-linux@*" {
fileinto "archiv.unverteilt";
}

??

Viele Grüße
pixel

Jasper
04.10.04, 23:24
Das fetchen der Mails passiert ja mit dem User Sammelbox und das Sieve-Filterskript erfolgt ebenfalls damit. Nun möchte ich alle E-Mails die als Ziel-Adresse "suse-linux@" enthalten in einen Shared-Folder welcher im cyradm als archiv.unverteilt angezeigt wird leiten. Wie würde die Filterregel dann aussehen. Etwas so:


require "fileinto";
if address :localpart :is "to" "suse-linux@*" {
fileinto "archiv.unverteilt";
}


der operator ":is" kann nicht mit wildcards verwendet verwenden. wildcards funktionieren nur mit ":matches".
ich habe aber meine zweifel, dass du als user auf die shared folder zugreifen kannst. woher soll cyrus wissen, dass "archiv.unverteilt" ein shared folder ist und nicht "INBOX.archiv.unverteilt" gemeint ist?

eine möglichkeit wäre, mit "redirect "+archiv.unverteilt@localhost" über mta->lmtpd->imapd in den shared folder zu packen. ist zwar etwas schräg, aber eine mögliche lösung falls das mit "fileinto" nicht klappt.


-j

pixel
05.10.04, 09:32
Hi@all,

ja es geht mit fileinto. Man muß lediglich den Pfad absolut angeben. Beispiel. in meine /etc/imapd.conf sind die beiden Zeilen:

userprefix: user
sharedprefix: public

Daher weiß der CYRUS ja welches das Prefix für User und welches für die Shared-Folder ist. Nun gebe ich das Ziel einfach absolut und nicht relativ zur Inbox an:

fileinto "public.archiv.unverteilt";

und schon geht es. Ob man die zwei Paramter in der imapd.conf unbedingt braucht kann ich jetzt nicht 100%ig sagen. Diese waren bei schon drin da nur damit die Sahred-Folder mit KMail richtig funktionieren.

@Jasper,

vielen Dank, ohne deine Hilfe hätte ich das nie geschafft.

@all,

kann mir jetzt noch jemand sagen wie man mehere Filterbedingungen in einem Skript kombiniert? Wenn ich z.B.

if Bedingung1 erfüllt
-> then führe Aktion 1 aus

else prüfe ob Bedingung 2 erfüllt ist
-> then führe Aktion 2 aus

usw.

Schreibe man die einfach untereinander?

pixel
05.10.04, 11:33
Habe die Verschachtelung mehrer Bedingungen und Aktion hinbekommen. Somit komm ich jetzt klar mit dem System.

Vielen Dank nochmal

pixel
06.10.04, 17:08
Hi@all,

habe mich zu früh gefreut so ganz klappt's noch nicht. Mein Filter-Skript sieht so aus:


require "fileinto";
if address :localpart :matches ["to", "cc"] "sven*" {
fileinto "user.sven";
stop;
}
elsif address :localpart :matches ["to", "cc"] "simone*" {
fileinto "user.simone";
stop;
}
elsif address :localpart :matches ["to", "cc"] "users@de.openoffice*" {
fileinto "public.archiv.Mailinglisten.OOo-Users";
stop;
}
else {
fileinto "public.archiv.unverteilt";
}

Das Problem muß irgendwie an der Verschachtelung liegen. Das komische ist. Die ersten beiden Regeln greifen was bedeutet das die Ankommenden Mails an sven* oder simone* in die richtige Box einsortiert wird. Nur bei den Mailinglisten haut es nicht hin.

Ein ankommende Mail mit dem Header:


[...]
ist-help: <mailto:users-help@de.openoffice.org>
list-unsubscribe: <mailto:users-unsubscribe@de.openoffice.org>
list-post: <mailto:users@de.openoffice.org>
Reply-To: users@de.openoffice.org
Delivered-To: mailing list users@de.openoffice.org
Received: (qmail 29151 invoked from network); 30 Sep 2004 10:37:20 -0000
From: M.Santhoff@t-online.de (Marc Santhoff)
To: OOo-Mailingliste <users@de.openoffice.org>
In-Reply-To: <41556B4F.2070705@ritterfamily.de>
References: <41556B4F.2070705@ritterfamily.de>
Content-Type: text/plain; charset=iso-8859-15
Message-Id: <1096540684.279.20.camel@zaphod.das.netz>
Mime-Version: 1.0
X-Mailer: Ximian Evolution 1.4.5
Date: Thu, 30 Sep 2004 12:38:04 +0200
Content-Transfer-Encoding: 8bit
[...]
landet nicht wie die Regel:

elsif address :localpart :matches ["to", "cc"] "users@de.openoffice*" {
fileinto "public.archiv.Mailinglisten.OOo-Users";
stop;
eigentlich besagt im:
public.archiv.Mailinglisten.OOo-Users
sondern in:
public.archiv.unverteilt

Es greift also die letzte Regel obwohl doch das Muster passt.

Die Tatsache das er die letzte Regel ausführen kann bestätigt auch das es nicht daran liegen kann das es sich bei dem Ziel um Shared-Folder handelt des sowohl "Mailinglisten.OOo-Users" wie auch "unverteilt" sind Shared-Folder.

Zunächst dachte ich es leigt an den Rechten. Die passen jedoch:


lam archiv
sammelbox wip
[...]
lam archiv.unverteilt
sammelbox wip
[...]
lam archiv.Mailinglisten
sammelbox wip
[...]
lam archiv.Mailinglisten.OOo-Users
sammelbox wip
[...]
Also auf allen beteiligten Ebenen sind die Rechte vorhanden. Außerdem habe ich mich vom Client aus als User 'sammelbox' angemeldet und die Rechte (Ordner erstellen, Mail hinein schieben) überprüft.

Wo habe ich den Fehler gemacht?

Viele Grüße
pixel

Jasper
06.10.04, 18:15
...
elsif address :localpart :matches ["to", "cc"] "users@de.openoffice*" {
fileinto "public.archiv.Mailinglisten.OOo-Users";
stop;
...
Wo habe ich den Fehler gemacht?


localpart heisst deshalb localpart, weil nur der lokale teil der adresse gemeint ist. der lokale teil von "users@de.openoffice.org" ist demnach "users" und das matcht niemals nicht mit "users@de.openoffice*"


-j

pixel
06.10.04, 20:58
ok hab's kapiert. Jetzt funktioniert die Sortieranlage wie geschmiert. Berücksichtigt Sieve eigentlich nur eingehende Mails? Gibt es auch ein Möglichkeit solche Regeln für ausgehende Mails zu erstellen?

Viele Grüße
pixel

Jasper
06.10.04, 23:01
ok hab's kapiert. Jetzt funktioniert die Sortieranlage wie geschmiert. Berücksichtigt Sieve eigentlich nur eingehende Mails? Gibt es auch ein Möglichkeit solche Regeln für ausgehende Mails zu erstellen?


sieve greift nur bei message delivery. es gab/gibt auf der mailingliste überlegungen, dieses verhalten zu ändern (für verschieben von mails z.b.)
aber bis 2.2.8 hat sich da AFAIR nichts getan.


-j