Procmail变量基于条件

时间:2014-10-06 03:44:17

标签: linux shell procmail

我正在运行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

1 个答案:

答案 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(更多),包括LOCKSLEEPLOCKTIMEOUT

琐碎的回答"如何说'如果'在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的选项;默认情况下它只会继承环境的已清理副本)或在其命令行以及配方文件中。