Ok, no final, resolvi isso escrevendo um filtro de e-mail / milter que funciona da seguinte maneira:
- Se a mensagem couber em um padrão
From:
/Subject:
, ela será processada posteriormente. Caso contrário, é diretamente aceito. - No caso de processamento, coloque-o em um banco de dados sqlite com um registro de data e hora e um campo
To:
. - Se houver
==
X mensagens nos últimos Y segundos, envie uma mensagem de aviso informando ao destinatário que o email foi filtrado / descartado. - Se houver
<
X mensagens nos últimos Y segundos, envie o e-mail. - Se houver
>
X mensagens nos últimos Y segundos, envie o e-mail.
Ao usar transações corretamente, pode ser garantido que (1) não mais que X e-mails são enviados em Y segundos e que (2) uma mensagem de aviso "que e-mails futuros serão descartados" pode ser enviada ao atingir o limite exatamente uma vez.
Até agora, isso funciona muito bem.
Observe que isso também pode ser expandido para mesclar os e-mails em um resumo após o término do burst, mas no final não estou disposto a investir tempo na implementação.