정규식 체 스크립트가 일치하지 않습니다

정규식 체 스크립트가 일치하지 않습니다

내가 작성한 시브(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"에서 "_"까지의 범위로 해석됩니다. 이는 유효하지 않습니다(정규식에 대한 제가 이해하는 한 유효하지 않습니다. 아마도 비둘기장 정규식 구현의 특이한 점일 수 있습니다). 따라서 여기서 "-"는 이스케이프되어야 합니다.

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

관련 정보