正規表示式篩腳本不匹配

正規表示式篩腳本不匹配

我在使用我編寫的 sieve 腳本的 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」。但由於某種原因,所有郵件都堆積在收件匣中。

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

答案1

鴿舍篩文檔不清楚這一點 - 我認為你必須深入研究 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;
    }
}

答案2

所以以下工作有效:

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)所指出的那樣,「存在」似乎區分大小寫。修復此問題後,我在日誌中遇到了錯誤。在正規表示式中

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

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

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

相關內容