Я использую 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
действия. (Но да, парсинг файлов журналов отстой.)