다음이 포함된 스팸을 차단하기 위해 exim 필터를 만들려고 합니다.
“85% 할인”
제목 줄에. 공백, 두 자리 숫자, 퍼센트 기호, 공백 및 모두 대문자로 된 "OFF"라는 단어입니다. 이것이 내가 쓴 것입니다:
# Exim filter
if
$header_subject: contains " \\d{2}% OFF"
then
fail text "no spam please"
seen finish
endif
그런데 이게 안되는 것 같고, 매칭된 메시지가 전달되더라도 통과가 허용되는 것 같습니다.정규 표현식 101시험. 내가 무엇을 놓치고 있나요? 올바른 구문은 무엇입니까?
답변1
일시적 .forward
으로 내 것을 귀하의 것으로 교체했는데 작동하지 않는 것을 확인했습니다.
두 가지 질문이 있습니다.
contains
하위 문자열 일치를 수행하지만 정규식을 이해하지 못합니다.matches
대신 원하는 정규 표현식을 사용하세요contains
.PCRE 스타일 문자 클래스는 구문과 마찬가지로
\d
손상된 것처럼 보입니다 !{N}
다양한 조합을 시도해 봤습니다. 유일한 유효한 구문은 작동하지 않더라도 작동[0-9][0-9]
하지 않습니다 . (저는 버전 4.72를 실행하고 있습니다.)[0-9]{2}
[0-9]\\{2\\}
\\d\\d
편집: 이유는 다음과 같습니다. 정규식에 공백이 포함되어 있지 않으면 Exim 필터 파일의 정규식을 따옴표로 묶을 필요가 없습니다. 그러나 따옴표가 없는 정규식에서도 백슬래시는 두 배가 되어야 합니다. 인용된 정규식에서는 다시 두 배로 늘려야 합니다.$header_subject: matches "\\\\d{2}% OFF"
.count `em: 백슬래시 4개.
스크립트 테스트를 사용하십시오 /usr/sbin/exim -bF <scriptfile> -f <sender>
. 테스트 메시지는 표준 입력(예: 파일에서 리디렉션)으로 제공되어야 합니다.
테스트 Subject:
처리의 경우 해당 헤더 행만 포함하고 다른 것은 포함할 수 없습니다. F
의 대문자는 명령 처리를 -bF
활성화하는 데 사용되며 를 사용하면 비활성화됩니다 .fail
-bf