Определите, содержит ли электронное письмо определенное число определенного символа

Я надеюсь записать правило SpamAssassin, которое будет соответствовать, если электронное письмо будет содержать n из определенного символа в теле сообщения. Не обязательно непрерывный. Так, например, если было десять общих звездочек в сообщении, то соответствуют правилу.

Я знаю, как записать правило, если существует десять непрерывных звездочек, как так:

body TEN_ASTERISKS /(**********)/
score TEN_ASTERISKS 0.5
describe TEN_ASTERISKS Message body contains ten asterisks.

Как я переписал бы правило соответствовать на десяти общих звездочках, не обязательно подряд?

1
задан 7 July 2015 в 01:40
1 ответ

Вышеуказанное правило некорректно и не будет работать.

Правила SpamAssassin - это регулярные выражения, поэтому от них нужно просто избавиться:

body TEN_ASTERISKS /\*\*\*\*\*\*\*\*\*\*/
score TEN_ASTERISKS 0.5
describe TEN_ASTERISKS Message body contains ten asterisks.

Кроме того, скобки не нужны. Они образуют группу захвата, которая хранится в памяти, что (если предположить, что вы видите много писем, помеченных звездочкой) может привести к сбоям на вашем сервере.

(Вы также можете сделать тело TEN_ASTERISKS /\*{10}/, но я хотел бы привести более простой пример. Регулярные выражения очень мощные.)


Для соответствия десяти отдельным звездочкам нужны флаги, кратные:

body     __HAS_ASTERISK  /\*/
tflags   __HAS_ASTERISK  multiple maxhits=11
meta     TEN_ASTERISKS   __HAS_ASTERISK > 10
score    TEN_ASTERISKS   0.5
describe TEN_ASTERISKS   Message body contains ten asterisks.

Кусок maxhits=11 является оптимизацией. Оно говорит SpamAssassin остановить подсчет (tflags multiple дорогостоящий запуск).

.
4
ответ дан 3 December 2019 в 17:39

Теги

Похожие вопросы