PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : nur der erste Empfänger bekommt die Mail



pixel
08.02.05, 15:51
Hi@all,

ich habe ein Problem mit meinem Mailsystem welches komischerweise erst jetzt aufgefallen ist.

Ich betreibe das Ganze so das ich beim ISP lediglich eine Sammelbox eingerichtet habe in welcher alle Mails landen. Auf meinem Mailsystem bzw. auf dem Anmelde-Server habe ich einen User "sammelbox" eingerichtet welcher die Mails vom ISP fetcht.

Bei der Übergabe an den CYRUS-IMAP mache ich dann mittels Sieve-Skript (für den User Sammelbox) die Mailverteilung auf die Userboxen. Im Sieve-Skript sind für jeden User folgende Bedingungen definiert:


[...]
elsif address :matches ["to", "cc", "bcc"] "sven*@unseredomain.de" {
fileinto "user.sven";
stop;
}
elsif address :matches ["to", "cc", "bcc"] "gehr@unseredomain.de" {
fileinto "user.sven";
stop;
}
elsif header :contains ["Received"] "sven@unseredomain.de" {
fileinto "user.sven";
stop;
}
elsif header :contains ["Received"] "gehr@unseredomain.de" {
fileinto "user.sven";
stop;
}
[...]

Das funktioniert auch soweit das wenn ich eine Mail an:

sven@unseredomain.de
oder
sven.gehr@unseredomain.de
oder
gehr@unseredomain.de

sende landen die in der richtigen Box. Wenn ich jedoch eine Mail von extern an mehere User senden (im Anfeld) bekommt nur der erste Empfänger die Mail. Wo habe ich hier eine Denkfehler?

Viele Grüße
pixel

terpator
08.02.05, 17:00
Ich bin mir nicht so sicher, aber von der Idee her würde ich eher ein "if" als ein "elsif" verwenden.

Viele Grüße, Tobias

drcux
08.02.05, 17:25
und das stop weglassen...

pixel
08.02.05, 19:46
Hi@all,


Ich bin mir nicht so sicher, aber von der Idee her würde ich eher ein "if" als ein "elsif" verwenden.Das if habe ich lediglich bei der ersten Regel, also ganz am Anfang, welche hier aufgrund der Übersichtlichkeit fehlt. Ist das falsch? Beginnt jede Regel mit if?


und das stop weglassen...Was genau bewirkt das Stop? Ich dachte immer das die Regelkette dann sobald die Regel zutrifft verlassen wird. Auch hier die Frage, ist das falsch?

Viele Grüße
pixel

Roger Wilco
09.02.05, 01:07
Was genau bewirkt das Stop? Ich dachte immer das die Regelkette dann sobald die Regel zutrifft verlassen wird. Auch hier die Frage, ist das falsch?
Das stop bewirkt, dass jegliche Verarbeitung beendet wird. Wenn also die erste Abfrage zutrifft, wird durch das stop kein weiterer Vergleich mehr gemacht. Das Skript ist dann beendet.

drcux
09.02.05, 07:16
Das if habe ich lediglich bei der ersten Regel, also ganz am Anfang, welche hier aufgrund der Übersichtlichkeit fehlt. Ist das falsch? Beginnt jede Regel mit if?


Ja, weil die nächste Regel nur dann ausgeführt wird, wenn die vorgehende nicht zutrifft (elseif)

Also:

if fritz fileinto mueller
elseif mueller fileinto mueller
if peter fileinto meier
elseif meier fileinto meier

thom01
09.02.05, 07:33
Ich kenne Sieve nicht näher, aber wenn ich davon ausgehe, dass die allgemeinen Regeln der Programmierkunst hier auch zutreffen, wird das so nicht funktionieren.

Wenn die Mail da nicht mehrmals (für jede enthaltene Adresse) durchgeschleift wird (nichts deutet darauf hin), dann ist es egal, ob da ein stop steht oder nicht. Sobald eine Bedingung zutrifft, wird die ganze Konstruktion verlassen und aus ist es mit der weiteren Verteilung. Es fehlt eine Schleife, die für jeden Adressaten, der in der Mail enthalten ist, in die IF-Konstruktion eintritt.

pixel
09.02.05, 10:22
Hi@all,

ok das habe ich soweit verstanden und werde das probieren. Mal eine prinzipielle Frage. Wenn ich von extern eine Mail senden die im Empfänger zwei Adressen der gleichen Domain enthält z.B.:

sven@unseredomain.de
walter@unseredomain.de

Was kommt dann auf meinem lokalen Mailserver an. Ein oder zwei Mails? Es müssten doch zwei sein, oder?

Viele Grüße
pixel

Roger Wilco
09.02.05, 17:02
Was kommt dann auf meinem lokalen Mailserver an. Ein oder zwei Mails? Es müssten doch zwei sein, oder?
Zwei Mails, aber Cyrus IMAPd hat ein tolles Feature namens Duplicate suppression, welches doppelte Mails (gleiche Message-ID, Empfänger usw.) löscht. Da du ja zunächst anscheinend alle Mails an den gleichen Account fütterst, wird dieses Feature wohl eine der beiden Mails löschen.

pixel
09.02.05, 17:49
Hallo zusammen,

so ganz klappt das noch nicht. Ich möchte aber nochmal kurz das Konzept bei meinem Mailsystem erläutern.
Wie bereits gesagt wird beim Provider nur eine Sammelbox, in welcher alle Mails für alle User landen, gefetcht. Das fetchen dieser Sammelbox wird mit dem, speziell für diesen Zweck angelegten, User "sammelbox" durchgeführt.

Von diesem User sammelbox werden die Mails dann auch an IMAP übergeben. Hierbei gehen die Mails durch das Sieve-Skript.

Das Konzept bei dem Sieve-Skript ist so. Das die Mails nach verschieden Kriterien untersucht werden und in die entsprechende Box einsortiert werden. Am Ende gibt es ein letztes Aufangbecken. Hier landen alles Mails die durch eine Regel nicht zuzuordnen waren im Shared-Folder "unverteilt"

Nachfolgend das fast komplette Skript. Ich habe versucht es verständlich zu kommentieren


#
# Zunächst werden allen Mails die vom Spam-Filter das X-Spam-Flag
# verpasst bekamen in einen Shared-Folder für Spam gepackt
#
# Wenn das Zutrifft soll die weitere Überprüfung abgebrochen werden, also # stop
require "fileinto";
if header :matches ["X-Spam-Flag"] "YES" {
fileinto "public.share.Spam";
stop;
}
#
# Als nächstes werden alle Mails die vom Antivir-Mailgate generiert werden
# ebenfalls in einen speziellen Shared-Folder sortiert
#
if address :matches ["from"] "AvMailGate@*" {
fileinto "public.share.Virenmeldungen";
stop;
}
#
# Als nächstens werden die System-Mails welche das System generiert
# ebenfalls in einen speziellen Shard-Folder sortiert.
#
if address :matches ["to", "cc"] "root@*lokaledomain" {
fileinto "public.share.Systemmails";
stop;
}
#
# Nun kommt für jeden der "richtigen" User der nachfolgende Block
#
if address :matches ["to", "cc", "bcc"] "andrea*@unseredomain.de" {
fileinto "user.andrea";
}
if address :matches ["to", "cc", "bcc"] "greiner*@unseredomain.de" {
fileinto "user.andrea";
}
if header :contains ["Received"] "andrea@unseredomain.de" {
fileinto "user.andrea";
}
if header :contains ["Received"] "greiner@unseredomain.de" {
fileinto "user.andrea";
}
[...]
#
# So und am Ende kommen die gemeinsamen Boxen wie info, office, support # etc.
#
if address :matches ["to", "cc", "bcc"] "info*@unseredomain.de" {
fileinto "public.share.SWS.Zentraleingang";
stop;
}
if address :matches ["to", "cc", "bcc"] "office*@unseredomain.de" {
fileinto "public.share.SWS.Zentraleingang";
stop;
}
if address :matches ["to", "cc", "bcc"] "support@unseredomain.de" {
fileinto "public.share.SWS.Support";
stop;
}
if address :matches ["to", "cc", "bcc"] "bug@unseredomain.de" {
fileinto "public.share.SWS.Support";
stop;
}
#
# Und am Ende der Ausputzer der alles was nicht zuzuordnen war in den
# Shared-Folder "unverteilt" soriert
#
else {
fileinto "public.share.Unverteilt";
}
Bei allen Regeln hatte ich nun zunächst wie es angeraten wurde aus elsif ein if gemacht. Weiterhin habe ich zunächst alle stop-Anweisungen entfernt. Dies hatte aber den Effekt das eine Kopie aller! Mails in meinem Unverteilt gelandet sind was natürlich weniger sinnvoll ist.

Nun habe ich bei den letzten Boxen (info, office, support und bug) die Stop-Zeile wieder eingefügt und wenn ich nun eine Mail von extern an einen realen User UND! eine dieser Boxen sende klappt das auch. Die Mail ist landet dann sowohl bei dem User in der Inbox und z.B. im Support.
Sende ich eine Mail aber NUR an einen User habe ich wieder den Effekt das sie sowohl in der Inbox des Users UND zusätzlich im Unverteilt landet.

Mir ist auch klar warum. Denn die Regelkette wird dabei nicht mit Stop verlassen aber mir ist absolut nicht klar wie ich das Skript strukturieren muß damit es funktioniert.
Ich bräucht vor der letzten Regel für unverteilt eine Anweisung das wenn eine oder mehrere Regeln bereits zutrafen die letzte nicht mehr durchlaufen wird.

Viele Grüße
pixel

pixel
09.02.05, 17:52
@Roger Wilco,

habe deine Antwort zu spät gesehen. Weißt du ob man dieses Feature abschalten kann? Wenn nähmlich zwei Mails mit unterschiedlichen Empfängern erzeugt würde hätte ich das Problem ja nicht. Dann könnte ich wie am Anfang mit den Stop-Zeilen immer die Regel verlassen.

Viele Grüße
pixel

Roger Wilco
09.02.05, 20:49
Weißt du ob man dieses Feature abschalten kann? Wenn nähmlich zwei Mails mit unterschiedlichen Empfängern erzeugt würde hätte ich das Problem ja nicht.
Ja, man kann das abschalten:

duplicatesuppression: 1
If enabled, lmtpd will suppress delivery of a message to a mailbox
if a message with the same message-id (or resent-message-id) is
recorded as having already been delivered to the mailbox. Records
the mailbox and message-id/resent-message-id of all successful
deliveries.

pixel
10.02.05, 12:08
Hallo zusammen,

also ich habe das mal versucht. In der imapd.conf habe ich:

duplicatesuppression: 0

gesetzt. Anschließend den IMAP neu gestartet. Im Sieve-Skript habe ich wieder bei allen Regeln die Stop-Zeile eingefügt. Nun habe ich wieder genau das gleiche Problem wie am Anfang. Sende ich eine Mail von extern die zwei Adressen im To-Feld hat:

sven@unseredomain.de
support@unseredomain.de

bekommt nur Sven die Mail. Der Support aber nicht. :(

Noch jemand eine Idee?

Viele Grüße
pixel

pixel
10.02.05, 16:14
Hallo zusammen,

also das was ich wollte das ganz am Ende die Mail, sollte sie zuvor nicht einem oder mehrene Usern zugestellt worden sein, in einen Shared-Folder einsortiert wird scheint nicht zu funktionieren. Ich habe nun fast alles probiert.

Ich habe das ganze nun so gemacht das ich am Ende die Mails verwerfe. Hierzu habe ich am Ende ein:


[...]
else {
discard;
stop;
}

Ich wollte das eigentlich so machen das ich am Ende ein "reject" machen. Dazu habe ich anstatt des dicard folgendes gemacht:


[...]
else {
reject "Irgend ein Text";
stop;
}

Am Anfang des Skriptes habe ich das reject auch ergänzt:


require ["fileinto"; "reject"];

Allerding erhalte ich dann im Logfile:


[...]
sieve runtime error for sammelbox id
<22945909.1108045991554.OPEN-XCHANGE.WebMail.wwwrun@postgirl>:
Reject can not be used with aby other action
[...]

ok die Fehlermeldung verstehe ich schon aber den Sinn eben nicht. Ich habe doch innerhalb der letzten Regel keine weitere Aktion definiert.

Viele Grüße
pixel