A correção superficial de sua tentativa seria
:0
* B ?? [][!@#$%^&*(){}]+
* ! B ?? </[a-zA-Z]+/>
$DEFAULT/MalSpam/
se eu estiver achando que você está tentando corresponder uma sequência de dois ou mais caracteres de pontuação e uma seqüência de caracteres que são alfabéticos entre </
e />
como uma condição negada (ou seja, uma correspondência se presente impede a receita de combinar).
No entanto, quaisquer dois caracteres de pontuação (como apenas !!
) corresponderão ao primeiro regex; e não vejo por que você articula a segunda condição como você fez.
Um desafio é que muitos caracteres de pontuação são metacaracteres de expressão regular. Para corresponder a um literal [
ou (
ou *
, você precisa fazer escape de barra invertida ou colocá-los em uma classe de caracteres. (Uma classe de caractere contendo [
é [[]
, o que leva um tempo para quebrar a cabeça. Isso é um literal [
dentro dos colchetes de classe de caractere [
... ]
. E uma classe de caractere contendo ]
e [
precisam tê-los nessa ordem, então [][]
.) Eu fiz o primeiro regex simples colocando tudo em uma classe de caractere, mas como é, provavelmente é muito amplo . Eu talvez exigisse que houvesse uma sequência de, digamos, quatro ou cinco em sequência. (Infelizmente, a variante regex do Procmail não suporta o quantificador numérico egrep
'co_de%; seria útil aqui.)
:0B
* [][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}]
* ! </[a-zA-Z]+/>
$DEFAULT/MalSpam/
Se você observar com atenção, verá que o primeiro é [class]{5,}
repetido cinco vezes. Se você quiser torná-lo mais longo (como 500 ocorrências adjacentes), basta repetir quantas vezes for necessário. Se a expressão inteira for maior que [][!@#$%^&*(){}]
, você precisará observar também - se quiser criar espaço para uma regex de sete caracteres 500 vezes, ou seja, 10.200 bytes, é necessário certificar-se de que LINEBUF
é pelo menos tão grande antes da receita que contém essa expressão longa.
Observe também como um sinalizador LINEBUF
na receita elimina a necessidade de colocar B
em cada linha de receita individual.
Se você quiser comparar a duração da mensagem, basta usar B ??
e o número desejado. Com o sinal >
, :0B
corresponderá a um corpo com mais de 512 bytes.
Para sua pergunta final, * > 512
é basicamente equivalente à classe de caractere \W
(um único caractere que não está no intervalo [^A-Za-z0-9_]
ou o intervalo A-Z
ou o intervalo a-z
ou o caractere 0-9
).