uso de regex na filtragem de exim

2

Estou tentando criar um filtro exim para bloquear mensagens de spam que contenham

" 85% OFF"

na linha de assunto. É um espaço em branco, depois dois dígitos, depois o sinal de porcentagem, um espaço em branco e a palavra OFF em letras maiúsculas. Isto é o que eu escrevi:

# Exim filter
if
  $header_subject: contains " \d{2}% OFF"
then
   fail text "no spam please"
   seen finish
endif

No entanto, isso parece não funcionar e permite a correspondência das mensagens, embora passe no teste regex101 . o que estou perdendo? Qual é a sintaxe correta?

    
por beerallica 02.07.2015 / 15:37

1 resposta

2

Eu substituí temporariamente meu arquivo .forward pelo seu e confirmei que ele não funciona.

Existem dois problemas.

  1. contains executa uma correspondência de substring e não entende expressões regulares. Para regexes, você deseja matches em vez de contains .

  2. A classe de caractere \d do estilo PCRE parece estar quebrada, assim como a sintaxe {N} ! Eu tentei todos os tipos de combinações. A única sintaxe que funcionou foi [0-9][0-9] . Mesmo [0-9]{2} não funcionou e nem [0-9]\{2\} nem \d\d . (Estou executando a versão 4.72.) Edit: Aqui está o motivo: As cotas não precisam ser usadas em regexes nos arquivos de filtro do Exim, exceto quando os regexes contêm whitspace. No entanto, as barras invertidas devem ser duplicadas, mesmo em expressões regulares não citadas. Nos regexes citados, eles devem ser duplicados novamente: $header_subject: matches "\\d{2}% OFF" . Conte-os: quatro barras invertidas.

Teste seu script com /usr/sbin/exim -bF <scriptfile> -f <sender> . Uma mensagem de teste deve ser fornecida na entrada padrão (por exemplo, redirecionada de um arquivo).

Para testar o processamento Subject: , ele pode conter apenas essa linha de cabeçalho e nada mais. O capital F in -bF é ativar o processamento do comando fail que está desativado se você usar -bf .

    
por 02.07.2015 / 17:25