Ich verwende procmail
einfache 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, procmail
in einem Verzeichnis zu speichernUndein Skript ausführen?
ich weiss ich kannRohra |command
, aber ich würde es vorziehen, procmail
die 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, f
weil es kein Filter ist. Wenn die Regel zutrifft, soll Procmail hier anhalten (ich hoffe, ich verstehe das Handbuch hier nicht falsch).
W
um Programmfehler zu unterdrücken
h
ZuRohrnur Überschriften
i
um 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-comsatd
bevor 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:
f
Betrachten Sie das Rohr als Filter.w
Warten 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.c
Erzeugt 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 f
Flagge 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 comsat
standardmäß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.log
stattdessen Ihre überwacht. (Aber ja, das Parsen von Protokolldateien ist ätzend.)