Dovecot
正則表達式篩子腳本不匹配
我在使用我編寫的篩子腳本的 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; } }