procmail 保存到目录并执行脚本?

procmail 保存到目录并执行脚本?

我使用procmail简单Maildir/的规则(如下所示)将传入的电子邮件保存到目录中:

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

现在我想要有关某些目录/规则中的新电子邮件的桌面通知,我已经知道如何处理通知,但如何告诉procmail保存到目录中执行脚本?

我知道我可以管道a|command但我更愿意procmail保存文件,然后运行脚本。

将电子邮件(至少是标头)放在管道中或将 dir+文件路径作为参数会很好,异步运行脚本也会很好。

更新

所以,根据 @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因为不想等待脚本返回

我想我也不需要锁定文件(:之后不需要Whi

2014 年 12 月 5 日更新

最后我完全采用了@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。 (但是,解析日志文件很糟糕。)

相关内容