Dobre o estouro de muitos e-mails em um só?

1

Estamos executando um sistema de agendamento de trabalho SGE. Os usuários podem deixar o SGE enviar e-mails em caso de cancelamento de trabalhos. No caso de um usuário ter grandes tarefas de array (digamos 100.000 entradas) e matar todas de uma vez (muito fácil com qkill -u USER ), a conta de e-mail do usuário será sobrecarregada com e-mails.

Todo o email parece ter sido enviado a partir de [email protected] e tem o assunto "Job <numeric job id> (<name of script>) Killed" .

Todo o email é executado por meio de uma instância de postfix configurada para ser um proxy de email, pois coleta trabalhos de todos os nós e os encaminha para o host de email real da organização.

Eu gostaria de alcançar o seguinte:

  • Mantenha todos os e-mails por, digamos, 30 segundos até o encaminhamento.
  • Considere os e-mails dos últimos 30 segundos e verifique se há alguma duplicata (mesmo To: , os assuntos diferem apenas no ID do trabalho numérico).
  • Se mais de, digamos, 10 e-mails semelhantes foram recebidos:
    • Criar um email "dobrável" com o assunto "Emails dobrados para muitos trabalhos () Matado"
    • Mostrar corpo dos primeiros 5 e-mails
    • Em seguida, exiba "And <number> similar emails were dropped"
    • Defina a hora do email para a hora atual e coloque-a na fila.
  • No caso de isso acontecer várias vezes, o <number> acima deve ser incrementado de acordo.
  • E-mails com mais de 30 segundos devem ser enviados.

Acho que não encontrei as palavras-chave corretas, mas não consegui encontrar o lugar certo para entrar nesse script. Qual seria um bom local para esse roteiro?

Eu não tenho problema em escrever um script como esse, mas se alguém souber de algo existente, eu estaria interessado em saber mais sobre isso.

    
por Manuel 17.11.2017 / 14:41

1 resposta

0

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.

    
por 18.12.2017 / 21:45