0

我正在运行 procmail 配方,它会在我收到特定电子邮件时触发我的一些应用程序。我有整个工作,但现在我需要在配方中建立条件,以免它一次又一次地运行,以避免同一程序的多个实例,因为我每 10 分钟触发一次 procmail。问题是我不确定 procmail 中的“if”语句是如何生成的。

这是我到目前为止的食谱:

:0
* ^Subject: .*Email Subject!
| export DISPLAY=:0.0; 
  xrandr --size 1360x768;\
  firefox "link"; \
  timeout 10s recordmydesktop --fps 30; \
  xrandr --size 1366x768
4

1 回答 1

2

在 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(更多)更多信息,包括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 的选项;默认情况下它只会继承您的环境的清理副本)或其命令行以及您的配方文件中。

于 2014-10-06T04:37:30.703 回答