在 Procmail 中拥有关键部分的简单且惯用的方法是使用锁定文件。
# Notice the second colon and the name of the lock file to use
:0:firefox.lock
* ^Subject: .*Email Subject!
| export DISPLAY=:0.0;
xrandr --size 1360x768;\
firefox "link"; \
timeout 10s recordmydesktop --fps 30; \
xrandr --size 1366x768
这将$MAILDIR/firefox.lock
在评估配方时创建,并在配方完成时将其删除。如果文件已经存在,Procmail 将等待它消失,或者最终超时(这可能导致传入的邮件退回)。
如果您需要跨越多个配方的关键部分,您可以分配给“神奇”变量LOCKFILE
并在完成后将其设置为空值。
LOCKFILE=firefox.lock
# ... Your recipes here ...
LOCKFILE=
(很明显,这个例子最后一行的等号是可选的;但我建议不要使用这种用法。)
查看man 5 procmailrc
(更多)更多信息,包括LOCKSLEEP
和LOCKTIMEOUT
。
“如何在 Procmail 中说‘如果’”的简单答案是使用条件。你已经有了一个;仅当消息的标头与正则表达式匹配时才会触发该操作^Subject:.*Email Subject!
。您可以嵌套这些条件、测试变量、外部命令等。这是一个愚蠢的虚构示例来演示它们。
# If $FOO is set and non-empty
:0
* FOO ?? .
{
# ... then enter this nested block
# Does $HOME/bar exist?
:0
* ? test -e $HOME/bar
barista
# Otherwise, unconditionally deliver to foolish
:0
foolish
}
如果设置了变量,则进入块FOO
。Procmail 使用您的环境变量,因此您可以在调用 Procmail 之前设置它(取决于 Procmail 的选项;默认情况下它只会继承您的环境的清理副本)或其命令行以及您的配方文件中。