我正在运行procmail recipe,当我收到一封特定的电子邮件时,它会触发我的一些应用程序。我已经完成了所有的工作,但是现在我需要在配方中构建一些条件,以免它一次又一次地运行,从而避免同一个程序的多个实例,因为我每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

最佳答案

在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,并在配方完成时将其删除。如果文件已经存在,Copmail将等待直到它消失,或者最终超时(这可能导致传入消息弹跳)。
如果你需要一个跨越多个食谱的关键部分,你可以分配给“magical”变量LOCKFILE并在完成后将其设置为空值。
LOCKFILE=firefox.lock

# ... Your recipes here ...

LOCKFILE=

(显然,本例最后一行的等号是可选的;但我建议不要使用这种用法。)
更多信息请参见man 5 procmailrc,包括LOCKSLEEPLOCKTIMEOUT
“如何在Procmail中说‘if’”的简单答案是使用条件。您已经有了一个;只有消息头与正则表达式匹配时,才会触发该操作。您可以嵌套这些条件、测试变量、外部命令等。这里有一个愚蠢的虚构示例来演示它们。
# 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
}

如果设置了变量^Subject:.*Email Subject!,则输入块。Procmail使用您的环境变量,因此您可以在调用Procmail(取决于Procmail的选项;默认情况下,它将只继承您的环境的净化副本)或在其命令行以及配方文件中设置它。

关于linux - 基于Procmail变量的条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26209769/

10-11 21:21