我使用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
。 (但是,解析日志文件很糟糕。)