Procmail in einem Verzeichnis speichern und ein Skript ausführen?

Procmail in einem Verzeichnis speichern und ein Skript ausführen?

Ich verwende procmaileinfache Maildir/Regeln wie die folgende, um eingehende E-Mails in Verzeichnissen zu speichern:

:0:
* ^X-Spam-Status: Yes
Spam/

Jetzt möchte ich eine Desktop-Benachrichtigung über neue E-Mails in bestimmten Verzeichnissen/Regeln. Ich weiß bereits, wie man mit Benachrichtigungen umgeht, aber wie man anweist, procmailin einem Verzeichnis zu speichernUndein Skript ausführen?

ich weiss ich kannRohra |command, aber ich würde es vorziehen, procmaildie Datei speichern zu lassen, anstatt einfach ein Skript auszuführen.

Es wäre schön, wenn die E-Mail (zumindest die Header) in der Pipe oder das Verzeichnis+Dateipfad als Argumente vorhanden wären. Es wäre auch schön, das Skript asynchron auszuführen.

aktualisieren

Basierend auf der Antwort von @slm ist das also das Ergebnis:

:0 c:
* ^X-Spam-Status: Yes
Spam/

:0 Whi
* ^X-Spam-Status: Yes
| $HOME/install/bin/notify.sh

c Kopierendie Nachricht im Verzeichnis, sondern fährt mit den nächsten Regeln fort

Ich verwende es nicht, fweil es kein Filter ist. Wenn die Regel zutrifft, soll Procmail hier anhalten (ich hoffe, ich verstehe das Handbuch hier nicht falsch).

Wum Programmfehler zu unterdrücken

hZuRohrnur Überschriften

ium alle Schreibfehler in der Pipe zu ignorieren

Ich verwende es nicht w, weil ich nicht auf die Rückkehr des Skripts warten möchte.

Ich glaube, ich brauche auch keine Sperrdatei (kein :Nachkommastellen Whi)

Aktualisierung 05.12.14

Am Ende habe ich genau die von @tripleee vorgeschlagene Lösung übernommen.

Habe auch ein paar Minuten damit herumgespielt, mailutils-comsatdbevor ich aufgegeben habe.

.procmailrc:

COMSAT=no

Antwort1

Um die E-Mail durch ein Skript laufen zu lassen, können Sie Ihre Regel mithilfe von zwei Regeln wie folgt ändern:

:0: c
* ^X-Spam-Status: Yes
Spam/

:0: fw
* ^X-Spam-Status: Yes
| /usr/bin/python /work/scripts/process_mail.bash

Ihr Programm empfängt die E-Mail über STDIN. Sie müssen die möglicherweise transformierte E-Mail über STDOUT „echoen“.

fw bedeutet:

  • fBetrachten Sie das Rohr als Filter.
  • wWarten Sie, bis der Filter oder das Programm beendet ist, und prüfen Sie den Exitcode (wird normalerweise ignoriert). Wenn der Filter nicht erfolgreich ist, wurde der Text nicht gefiltert.
  • cErzeugt eine Kopie dieser E-Mail. Dies ist nur bei der Zustellung von Rezepten sinnvoll. Das einzige Rezept, das nicht zugestellt wird und auf das dieses Flag Auswirkungen hat, ist ein verschachtelter Block. Um eine Kopie zu erzeugen, wird der laufende Procmail-Prozess geklont (Sperrdateien werden nicht übernommen), wobei der Klon wie üblich fortfährt und der übergeordnete Prozess über den Block springt.

Verweise

Antwort2

Hier ist eine leichte Anpassung der Antwort von @slm.

Sie sollten mit Maildir keine Sperren verwenden, und die Flags und der Sperrdoppelpunkt waren falsch herum. (Sie würden effektiv eine Sperrdatei mit dem Namen erstellen c, anstatt die Nachricht zu klonen, sodass die zweite Aktion nie ausgelöst würde.)

Die fFlagge scheint fehl am Platz.

Ich habe die Reihenfolge der Aktionen umgekehrt. Während es aus Sicht von Procmail sinnvoll ist, erst zuzustellen und dann zu benachrichtigen, ist die Benachrichtigung eine sekundäre Aktion, die fehlschlagen darf. Daher mache ich das in einem Klon und ignoriere seinen Beendigungsstatus.

Und schließlich ist die Gruppierung zweier Aktionen unter einer Bedingung durch die Verwendung von Klammern intuitiver.

:0
* ^X-Spam-Status: Yes
{
    :0cWhi
    | $HOME/install/bin/notify.sh
    :0
    Spam/
}

Allerdings stelle ich auch fest, dass Procmail bereits comsatstandardmäßig Benachrichtigungen generiert. Das ist ein veraltetes Benachrichtigungsprotokoll, aber Sie können es vielleicht für etwas verwenden. Zweitens könnte ein einfacher Benachrichtigungsmechanismus mithilfe eines Skripts erstellt werden, das procmail.logstattdessen Ihre überwacht. (Aber ja, das Parsen von Protokolldateien ist ätzend.)

verwandte Informationen