Назад | Перейти на главную страницу

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

Я надеюсь написать правило 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 дорого в эксплуатации).