我正在运行procmail配方,当我收到特定的电子邮件时会触发我的一些应用程序。我有整个工作,但现在我需要在配方中建立条件,不要让它一次又一次地运行,以避免同一程序的多个实例,因为我每隔10分钟就有procmail触发器。问题是我不确定如何'如果'句子是在procmail中完成的。
这是我到目前为止的配方:
:0
* ^Subject: .*Email Subject!
| export DISPLAY=:0.0;
xrandr --size 1360x768;\
firefox "link"; \
timeout 10s recordmydesktop --fps 30; \
xrandr --size 1366x768
答案 0 :(得分:2)
在Procmail中使用critical section这一简单而惯用的方法是使用锁定文件。
# 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的选项;默认情况下它只会继承环境的已清理副本)或在其命令行以及配方文件中。