Primeiro, é importante que você entenda que um cliente pode enviar um e-mail com 1 endereço no cabeçalho "Para", mas na verdade enviá-lo para 1.000 pessoas, se descobrir como abusá-lo da maneira correta. A contagem do número de endereços de e-mail no cabeçalho Para: ou Cc: não garante que você bloqueie os e-mails que um cliente está enviando. Você só bloqueará seus e-mails se eles abusarem do sistema de maneira ingênua. No entanto, você afirmou que eles estão apenas colocando tudo no campo Para (ou seja, a maneira ingênua), portanto, o restante dessa resposta assume que essa é a forma como os dados estão sendo enviados ao servidor Exim.
Agora, para responder à sua pergunta diretamente como você pediu: Na ACL DATA (somente na DATA ACL!), você pode verificar o número de endereços de e-mail no cabeçalho Para ou Cc por um processo em duas etapas. Para testar esses cabeçalhos, você o acessa com $ h_To: e $ h_Cc: O cólon final é obrigatório. Vamos supor que o cabeçalho To: seja:
"Org user" <[email protected]>,<[email protected]>,"Todd Lyons" <[email protected]>
Com este exemplo, mostrarei o que cada etapa do processo de duas etapas faz:
# Step 1: To header converted to a (colon-separated) list
$ exim -be '${addresses:"Org user" <[email protected]>,<[email protected]>,"Todd Lyons" <[email protected]>}'
[email protected]:[email protected]:[email protected]
# step 2: Now count the number of list items
$ exim -be '${listcount:${addresses:"Org user" <[email protected]>,<[email protected]>,"Todd Lyons" <[email protected]>}}'
3
Com as versões atuais do exim (4.82), a aparência final da sua DATA ACL será algo assim:
deny message = Too many recipients
condition = ${if >{ ${listcount:${addresses:$h_To:,$h_Cc:}} }{10} {yes}{no}}
Se você estiver usando uma versão mais antiga, como o que está no Debian estável, você pode usar uma versão mais antiga que itera na lista e incrementa um contador:
deny message = Too many recipients
condition = ${if >{ ${reduce {${addresses:$h_To:,$h_Cc:}} {0} {${eval:$value+1}}}} {10} {yes}{no}}
Note que em ambos os casos acima, a parte {yes} {no} é supérflua. O retorno da instrução $ {if ...} sempre será verdadeira ou falsa, então, com isso em mente, você pode deixá-la se quiser. Eu prefiro explicitamente colocá-lo porque torna mais legível (para mim e para qualquer um que possa me seguir e ter que ler este código).