Dovecot

正則表達式篩子腳本不匹配

  • March 2, 2018

我在使用我編寫的篩子腳本的 dovecot2 郵件伺服器上遇到問題。該腳本應自動將來自郵件列表的郵件移動到文件夾(按列表名稱,而不是列表 ID)

require ["fileinto", "mailbox", "variables", "regex"];
if exists "list-id" {
   if header :regex "list-id" "([a-zA-Z0-9][a-zA-Z0-9-_. ]+[a-zA-Z0-9.])" {
       fileinto :create "${1}";
       stop;
   }
}

對於帶有標題的郵件

List-Id: RZ Monitoring <rz-monitoring.lists.example.com>

此腳本應將所有郵件移動到文件夾“RZ Monitoring”。但由於某種原因,所有郵件都堆積在收件箱中。

腳本正在執行,我的日誌中沒有錯誤,所以我一定是腳本本身出錯了。

所以以下工作:

require ["fileinto", "mailbox", "variables", "regex"];
if exists "List-Id" {
   if header :regex "List-Id" "([a-zA-Z0-9][a-zA-Z0-9\\-_. ]+[a-zA-Z0-9.])" {
       fileinto :create "${1}";
       stop;
   }
}

就像 Andrew Schulman 指出的那樣,“exists”似乎是區分大小寫的。修復此問題後,我在日誌中遇到錯誤。在正則表達式中

([a-zA-Z0-9][a-zA-Z0-9-_. ]+[a-zA-Z0-9.])
                     ^

這個“-”被解釋為從“9”到“_”的範圍,ehich 是無效的(儘管據我對正則表達式的理解,它不應該。可能是 dovecots 正則表達式實現的一個怪癖)。所以這裡的“-”必須轉義

([a-zA-Z0-9][a-zA-Z0-9\\-_. ]+[a-zA-Z0-9.])

Dovecot sieve 文件對此並不清楚 - 我認為您必須深入研究 RFC - 但我認為exists運算符區分大小寫,儘管:regex不是。所以你應該使用List-Id而不是list-id

if exists "List-Id" {
   if header :regex "List-Id" "([a-zA-Z0-9][a-zA-Z0-9-_. ]+[a-zA-Z0-9.])" {
       fileinto :create "${1}";
       stop;
   }
}

引用自:https://serverfault.com/questions/899499