2014-10-06 88 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的選項;默認情況下,它只會繼承環境的清理副本),或者在其命令行以及配方文件中。