2014-10-06 68 views
0

Procmail变量基于我运行procmail配方,当我收到一个特定的电子邮件时,会触发我的一些应用程序。我有整个事情的工作,但现在我需要建立条件进入配方,以避免一次又一次地运行,以避免同一程序的多个实例,因为我每10分钟触发一次触发器。问题是我不确定'如果'句子是如何在procmail中做出的。如果条件

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

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

回答

1

最简单的和惯用的方式有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的选项;默认情况下,它只会继承环境的清理副本),或者在其命令行以及配方文件中。