procmail сохранить в каталог и выполнить скрипт?

procmail сохранить в каталог и выполнить скрипт?

Я использую procmailпростые Maildir/правила, подобные приведенному ниже, для сохранения входящих писем в каталогах:

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

Теперь я хотел бы получать уведомления на рабочем столе о новых письмах в определенных каталогах/правилах. Я уже знаю, как обрабатывать уведомления, но как указать procmailсохранять в каталоге?ивыполнить сценарий?

я знаю что могутрубкаа |command, но я бы предпочел сохранить procmailфайл, а затем просто запустить скрипт.

Было бы неплохо иметь в качестве аргументов адрес электронной почты (по крайней мере заголовки) или путь dir+file, асинхронный запуск скрипта также был бы хорош.

обновлять

Итак, основываясь на ответе @slm, вот результат:

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

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

c копиясообщение в каталоге, но продолжается по следующим правилам

Я не использую, fпотому что это не фильтр. Если правило совпадает, я хочу, чтобы procmail остановился здесь (надеюсь, я правильно понял руководство).

Wдля подавления любого сбоя программы

hктрубкатолько заголовки

iигнорировать любые ошибки записи в канал

Я не использую, wпотому что не хочу ждать, пока вернется скрипт.

Я думаю, мне тоже не нужен файл блокировки (никакого :after Whi)

обновление 12/5/14

В конце концов я принял именно то решение, которое предложил @tripleee.

Поиграл еще mailutils-comsatdнесколько минут, прежде чем сдаться.

.procmailrc:

COMSAT=no

решение1

Чтобы запустить почту через скрипт, вы можете изменить свое правило следующим образом, используя 2 правила:

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

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

Ваша программа получит почту на STDIN. Вам придется «отобразить» возможно преобразованную почту на STDOUT.

fw означает:

  • fРассматривайте трубу как фильтр.
  • wДождитесь завершения работы фильтра или программы и проверьте код выхода (обычно игнорируется); если фильтр не сработал, то текст не будет отфильтрован.
  • cСгенерировать копию этого письма. Это имеет смысл только при доставке рецептов. Единственный рецепт без доставки, на который влияет этот флаг, находится во вложенном блоке; для генерации копии будет клонирован работающий процесс procmail (файлы блокировки не будут унаследованы), в результате чего клон будет работать как обычно, а родительский элемент перейдет через блок.

Рекомендации

решение2

Вот небольшая адаптация ответа @slm.

Вам не следует использовать блокировку с Maildir, а флаги и двоеточие блокировки были перепутаны. (По сути, вы создадите файл блокировки с именем c, а не клонируете сообщение, поэтому второе действие никогда не сработает.)

Флаг fкажется неуместным.

Я поменял порядок действий на обратный. Хотя с точки зрения Procmail имеет смысл сначала доставить, а затем уведомить, уведомление — это вторичное действие, которое может не выполниться, поэтому я делаю это в клоне и игнорирую его статус завершения.

Наконец, группировка двух действий под одним условием становится более интуитивно понятной с помощью фигурных скобок.

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

Сказав это, я также отмечу, что Procmail уже генерирует comsatуведомления из коробки. Это устаревший протокол уведомлений, но вы можете использовать его для чего-то. Во-вторых, простой механизм уведомлений можно построить с помощью скрипта, который будет отслеживать ваши procmail.logдействия. (Но да, парсинг файлов журналов отстой.)

Связанный контент