So filtern und übermitteln Sie eine Nachricht in Procmail

So filtern und übermitteln Sie eine Nachricht in Procmail

Ich schreibe die Betreffzeile für bestimmte eingehende E-Mails je nach An:-Feld um:

:0fhw
* ! ^TO_user@domain\.com\>
* ^TO_[^<>@ ]+@domain\.com\>
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPAM]$MATCH"

Der obige Code (aus meiner früheren FrageProcmail schreibt die Betreffzeile neu, wenn der Benutzer des E-Mail-Empfängers den Übereinstimmungstest nicht besteht) funktioniert perfekt - wenn ich E-Mails von etwas ANDEREM bekomme ALS[email geschützt], die Betreffzeile wird umgeschrieben als [SPAM] (ursprünglicher Betreff)

Ich möchte jedoch mehrere Bedingungen dieser Art verwenden. Der Arbeitsblock oben soll der letzte sein, vorher möchte ich jedoch die Betreffzeile umschreiben, wenn das „An“ mit einer anderen Adresse übereinstimmt.

Also habe ich diesen Block direkt darüber hinzugefügt:

:0fh
* ^TO_special@domain\.com
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH"
$DEFAULT

... und das funktioniert - E-Mails an '[email geschützt]' lassen Sie ihre Betreffzeile umschreiben.

Das Problem ist, dass Procmail nicht anhält, sondern auf dienächste[email protected]Block und schreibt es erneut um. Die Betreffzeilen gesendeter E-Mails werden also wie folgt umgeschrieben:

[SPAM] [SPECIAL] Ursprüngliche Betreffzeile, bla bla

Warum ist das so? Warum $DEFAULTführt die Aktion am Ende des ersten Blocks nicht dazu, dass Procmail die Verarbeitung dieses E-Mail-Teils anhält?

Wie kann ich den neuen Block anpassen undstoppendiese Post bearbeiten und die Sache damit einfach hinter sich bringen?

Antwort1

Das $DEFAULTam Ende ist ein Syntaxfehler. Sie können nicht mehrere Aktionen für dasselbe Rezept angeben.

Was Sie tun können, ist, es in zwei Rezepte aufzuteilen oder in diesem Fall einfach das Umschreiben und die Übermittlung zu kombinieren.

:0:
* ^TO_special@domain\.com
* ^Subject:\/.+
| /usr/local/bin/formail -I"Subject: [SPECIAL]$MATCH" >>$DEFAULT

Dies hat die Flags nicht mehr, fhweil wir die ganze Nachricht durchschieben wollen (nicht nur die Header, was der hFall ist) und wir die Ergebnisse der Pipeline zustellen und nicht zurück in Procmail erfassen wollen (was der fFall ist).

Dies setzt voraus, dass es $DEFAULTsich um eine Datei und nicht um ein Verzeichnis handelt. Daher fügen wir auch eine zweite hinzu, :um die Sperre anzugeben.

Wenn Sie zwei Aktionen unter einem einzigen Bedingungssatz angeben möchten, können Sie Klammern mit mehreren darin enthaltenen Rezepten verwenden. Jedes Rezept kann null oder mehr Bedingungen, aber nur eine Aktion haben.

:0
* ^TO_special@domain\.com
* ^Subject:\/.+
{
    :0fhw
    | formail -I"Subject: [SPECIAL]$MATCH"

    :0:
    $DEFAULT
}

aber in diesem Fall ist das eine unnötige Komplikation.

(Es wäre vielleicht auch idiomatischer, die ^Subject:Bedingung in das formailRezept zu verschieben, wo sie logisch hingehört, aber das ist sowieso nur eine Tangente.)

Stellen Sie außerdem nebenbei sicher, dass Ihr PATHgleich zu Beginn korrekt ist, .procmailrcdamit Sie nicht den vollständigen Pfad für externe Dienstprogramme wie angeben müssen formail.

verwandte Informationen