Я надеюсь записать правило SpamAssassin, которое будет соответствовать, если электронное письмо будет содержать n
из определенного символа в теле сообщения. Не обязательно непрерывный. Так, например, если было десять общих звездочек в сообщении, то соответствуют правилу.
Я знаю, как записать правило, если существует десять непрерывных звездочек, как так:
body TEN_ASTERISKS /(**********)/
score TEN_ASTERISKS 0.5
describe TEN_ASTERISKS Message body contains ten asterisks.
Как я переписал бы правило соответствовать на десяти общих звездочках, не обязательно подряд?
Вышеуказанное правило некорректно и не будет работать.
Правила 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
дорогостоящий запуск).