• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

formail: Header setzen und filter weiter durchlaufen

Status
Für weitere Antworten geschlossen.

XeN

Newbie
Hallo, muss noch einmal nerven =).

Also ich möchte gerne eine Headerzeile hinzufügen in eine eMail hinzufügen. Das Problem ist nur das bei mir auf grund der Komplikationen mit Cc immer nur eine Kopie zugestellt wird und das "Original" rauscht einmal durch alle filter durch und landen bei den nachrichten die "Nicht zustellbar sind" Da das aber doof ist wollte ich die eMails die zugestellt wurden mit einem "X-Delivered: TRUE" header versehen und die eMails die einen solchen header haben löschen.

hier ein auszug aus der Procmailrc von mir:

Code:
# --- <Header Setzen> ---
:0cw
* ^(TO|Received).*sebastian@*
| formail -I "X-Delivery: TRUE"
# --- </Header Setzen> ---

# --- Restliche mails in die Inbox sortieren ---
:0 c
* ^(TO|Received).*sebastian@*
| /sbin/cyrdeliver -a -m sebasti
# --- bei Fehler zurueck in Queue
:0 e
{ EXITCODE=75 HOST }
# --- Restliche mails in die Inbox sortieren ende ---

Das Problem ist, entweder die eMail landet in der Mailbox für nicht zustellbare eMails UND in meiner mailbox, aber dann OHNE den header. Oder sie landet beim root in /var/spool/mail/root, wobei sie dann die headerzeile hat.

Wie kann ichs nun machen das der Header mit der bedingung geändert wird, die headerzeile geschrieben wird, dann die eMail ganz normal weiterläuft?

danke schon mal mfg XeN
 

TeXpert

Guru
man [procmail|procmailrc|procmailex]

Deine recipes sind alle mit :0c markiert, d.h. jedes Recipe arbeitet mit einer CarbonCopy
 
OP
X

XeN

Newbie
Danke für deinen beitrag, aber soweit das ich jedesmal eine Kopie mache war ich schon =), wie man meinem beitrag auch entnemen kann ;-).

Dies ist auch gewollt. Was nicht gewollt ist, ist das entweder die zeile hinzugefügt wird, dann aber nicht zugestellt wird. Oder die zeile nicht hinzugefügt wird und die mail dafür ankommt.

mfg
 

TeXpert

Guru
Code:
:0cw
* ^(TO|Received).*sebastian@*
| formail -I "X-Delivery: TRUE"
# --- </Header Setzen> ---

# --- Restliche mails in die Inbox sortieren ---
:0 c
* ^(TO|Received).*sebastian@*
| /sbin/cyrdeliver -a -m sebasti
# --- bei Fehler zurueck in Queue

die beiden recipes arbeiten _nicht_ auf der gleichen Mail --> jeweils auf einer Kopie!

schreib mal genauer, was Du willst, was soll durch das "X-Delivery: TRUE" ereicth werden? Du willst alle Mails an sebastian taggen und mit cyrdeliver einordnen und alls anderen Mail löschen?
 
OP
X

XeN

Newbie
Das Grundproblem besteht darin das ich im moment ca 7 user auf dem Mailsystem habe. Das bedeutet das ich auch 7 filterdateien habe die nicht in den Homes liegen sondern in einem unterverzeichnis von /etc/procmail. Von da werden sie in die "haupt" procmailrc eingebunden diese wird in die /etc/procmailrc eingebunden.

Muss es so machen weil ich die regeln per script anfüge und erstelle. Da die letzte regel aber immer ein auffangbecken für nicht einsortierbare mails sein soll musste ich das so machen.

Jedenfalls angenommen ich ziehe keine copys sondern mache es mit :0w, und es kommt eine email an user1@domain mit cc an user2@domain und user1@domain steht in der "haupt.procmailrc" zuerst. Dann zieht die regel und die eMail kommt nicht mehr beim user2@domain an. Deswegen die copys.

Da nun aber dann alle eMails im auffangbecken landen und das bei einem echtbetrieb mit 100 usern ganz gut mein email postfach fluten würde möchte ich alle eMails die einsortiert wurden markieren und anhand dieser vor dem auffangbecken löschen.

ich weiss es ist extrem rumgetrixt, aber ich hab halt keine lust für jeden user eine regel zu basteln, zumal die immer gleich sind. Also habe ich in das useradd script für unsere groupware einfach ein paar zeilen hinzugefügt die an die haupt.procmailrc die verweiszeile auf user.procmailrc hinzufügt und die user.procmailrc erstellt.


wuaaaa wieder was viel geschrieben, hoffe du verstehst was ich möchte. Vielleicht hast du ja auch eine idee mit der ich diese Copy fummelei gar nicht machen muss.

mfg XeN
 

TeXpert

Guru
Ah, jetzt ja.

dann würde ich diese richtung mal evaluieren (quick-hack-with-no-manpage-reading-and-no-testing-beware):
Code:
:0
*^TO_user1
{ 
  :0 
  | formail -I "X-Delivered:TRUE

  :0c
  | cyrdeliver blah
}

:0
*^TO_user2
{ 
  :0 
  | formail -I "X-Delivered:TRUE

  :0c
  | cyrdeliver blah
}

... fortsetzen bis user n

:0 
* ^X-Delivered
/dev/null

# rest in inbox

wie gesagt, nur so als Simple idee...
 
OP
X

XeN

Newbie
Also habs jetzt mal getestet und die Regel sieht nun so aus

Code:
:0
* ^(TO|Received).*sebastian@*
{
        :0
        | formail -I "X-Delivered:TRUE"

        :0c
        | /sbin/cyrdeliver -a -m sebasti
}

Das ist der Output der procmail.log

Code:
procmail: Assigning "INCLUDERC=/etc/procmail/sebasti.procmailrc"
procmail: Match on "^(TO|Received).*sebastian@*"
procmail: Assigning "LASTFOLDER=formail -I X-Delivered:TRUE"
procmail: Notified comsat: "root@:/formail -I X-Delivered:TRUE"
 Subject: das
  Folder: formail -I X-Delivered:TRUE                                      1735
procmail: Executing "formail,-I,X-Delivered:TRUE"

So landet die eMail irgendwo im nirvana. Sie kommt noch nichtmal beim root unter /var/spool/mail/root an =(.
 

TeXpert

Guru
ich sach ja ist nix getestet :) da muss wahrscheinlich noch ein [f]ilter-Flag dazu, wenn mir noch was einfällt melde ich mich :p
 
OP
X

XeN

Newbie
an den flags probiere ich gerade rum.

Fakt ist jedenfalls das es funktioniert wenn ich das Formail auskommentiere. Also ist an der regel an sich nicht falsch. Ich vermute nur das er das formail falsch versteht und deshalb versucht es in eine mailbox formail ... zu schieben. ich werde weiter probieren.

Danke dir schon mal mfg XeN
 

TeXpert

Guru
interessantes Problem :) ich bin mir z.zt. nicht sicher, ob das mit den Nested Blocks wirklich funktioniert (wäre eleganter, aber...), aber das hier ist noch eine andere Idee (ausgehend von Deiner 1. Variante:

Code:
# Header setzen, Recipe als Filter und wait
:0 fw
* ^(TO|Received).*sebastian@*
| formail -I "X-Delivery: TRUE"
# ---

# --- an User zustellen (Kopie + wait)
:0 cw
* ^(TO|Received).*sebastian@*
| /sbin/cyrdeliver -a -m sebasti

# --- alle zugestellten verwerfen (keine Kopie)
:0 w
* ^X-Delivery: TRUE
/dev/null

# --- rest an müllsammler
:0
| /sbin/cyrdeliver -a -m muellsammler
 
OP
X

XeN

Newbie
hmmm

also nun sortiert er die mails wenigstens wieder zum root. Da ist dann auch wieder das X Tag drinne. Aber ich verstehe nicht warum nun gar keine mail bei mir ankommt.

Irgendwie macht mich die ganze sache völlig wahnsinnig.

mfg


[edit]
Ich glaube Procmail hat ein Problem wenn ich formail mit :0fw einleite. Immer wenn ich das mache bekomme ich einen error 65 von cyrdeliver raus
[/edit]
 
OP
X

XeN

Newbie
Hab das logging schon auf verbose.

hier die zeile aus dem log

Code:
procmail: Assigning "INCLUDERC=/etc/procmail/sebasti.procmailrc"
procmail: Match on "^(TO|Received).*sebastian@*"
procmail: Executing "formail,-I,X-Delivery: TRUE"
procmail: Match on "^(TO|Received).*sebastian@*"
procmail: Executing "/sbin/cyrdeliver,-a,-m,sebasti"
procmail: Program failure (65) of "/sbin/cyrdeliver"
procmail: Assigning "LASTFOLDER=/sbin/cyrdeliver -a -m sebasti"
procmail: Assigning "EXITCODE=75"
procmail: Assigning "HOST"
procmail: HOST mismatched "mail"
procmail: Assigning "PATH=/root/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin/X11"
procmail: Locking "/var/spool/mail/root.lock"
procmail: Assigning "LASTFOLDER=/var/spool/mail/root"
procmail: Opening "/var/spool/mail/root"
procmail: Acquiring kernel-lock
procmail: Unlocking "/var/spool/mail/root.lock"
procmail: Notified comsat: "root@3610:/var/spool/mail/root"
From absender@domain.de  Thu Mar  3 14:22:23 2005
 Subject: test
  Folder: /var/spool/mail/root                                             1808
 
OP
X

XeN

Newbie
danach google ich die ganze zeit schon. Habe bis jetzt aber nur herausbekommen das das damit zutun hat das cyrdeliver von procmail nicht das übergeben bekommt was es gerne hätte. Aber genauer weiss ichs im moment auch nicht.

wobei der fehler auch nur dann kommt wenn ich die "f" flag gesetzt habe

mfg
 

TeXpert

Guru
nachdem ich nochmal drüber nachdenke: Du wirst immer Probleme bekommen, wenn Du user1 und user 2 in einer Mail hast, (to und CC) dann wird bei beiden Kopien (durch das flag c wird ja eine Kopie angelegt) der user1 mit ^TO_user1 matchen und somit wird der beide Kopiene bekommen.
 
OP
X

XeN

Newbie
eigendlich nicht weil:

email kommt.

check user 1 to -> no match
check user 1 cc -> MATCH -> ziehe copie -> stelle zu
check user x to -> no match
check user x cc -> no match
check user 2 to -> MATCH -> ziehe copie -> stelle zu
check user 2 cc -> no match
check sammelbox * -> match -> verschiebe in sammelbox


so siehts im moment aus

Habe mir auch überlegt. Kann ich nicht einfach als regel vor der Sammelbox sagen. Lösche alle eMails deren to,cc usw in der adressen.txt stehen?

Müßte man eigendlich machen können. Ich werd mal rumversuchen.

mfg
 
Status
Für weitere Antworten geschlossen.
Oben