Я надеюсь написать правило 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.
Кроме того, скобки не нужны. Они образуют группа захвата которые хранятся в памяти, что (при условии, что вы видите много писем, содержащих звездочки) может сказаться на вашем сервере.
(Вы также можете сделать body TEN_ASTERISKS /\*{10}/
но я хотел привести более простой пример. Регулярные выражения очень эффективны.)
Чтобы сопоставить десять отдельных звездочек, вам нужно tflags multiple
:
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
дорого в эксплуатации).