Descarte e-mails enviados para caixas de correio anteriormente indisponíveis no exim usando o banco de dados mysql

2

nós temos um portal comunitário maior que se tornou maior e maior ao longo dos anos, mas também tem algumas contas mortas. Recentemente, o ip do servidor foi colocado na lista negra porque muitos endereços de e-mail dos usuários não estão mais disponíveis (550) e o servidor estava enviando newsletters para eles.

Para evitar isso, estou filtrando caixas de correio desconhecidas indisponíveis no script php de envio, mas desejo que o exim assuma essa tarefa porque é mais universal.

Meu plano é usar um banco de dados mysql para listar as caixas de correio indisponíveis. Eu quero usar um script simples que percorre os arquivos de log e salva os endereços de e-mail da caixa de correio indisponíveis no banco de dados.

Não tenho certeza se é prática comum que alguns provedores apenas finjam que as caixas de correio não estão disponíveis porque o servidor estava na lista negra. Mas uma vez que 40% dos e-mails foram rejeitados com essa resposta e não consigo imaginar que muitos usuários tenham excluído suas contas de e-mail. Além disso, devo levar em consideração que as contas excluídas podem ser (re) criadas em algum momento. Então, junto com o endereço, eu armazenaria um timestamp ou seja, digamos 4 semanas no futuro. Nesse período, todas as mensagens para o endereço devem ser descartadas. Se o primeiro e-mail depois dessas 4 semanas puder ser entregue, tudo estará bem. Caso contrário, o período deve ser estendido (backoff exponencial ou assim).

Eu posso cobrir tudo isso com o script e eu já sei como uma consulta SQL que dá uma lista de endereços bloqueados seria semelhante:

SELECT blocked FROM maildrop WHERE name=${localpart}@${domain} and timestamp<UNIX_TIMESTAMP()

Mas a questão é: como faço para integrar isso corretamente na configuração do exim? No começo eu pensei que eu poderia usar aliases virtuais e redirecionar os e-mails para devnull @ localhost usuário cujos e-mails são canalizados para / dev / null.

Eu testei usando a seguinte configuração

mysql_sys_aliases:
  debug_print = "R: mysql_sys_aliases for $local_part@$domain"
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup mysql{SELECT login FROM aliases WHERE alias='${local_part}@${domain}'}}

BTW: Eu também testei mysql_aliases em vez de mysql_sys_aliases

e a seguinte entrada do banco de dados: alias: [email protected] | login: devnull @ localhost

Mas sem sucesso. Ainda recebi os emails em externaldomain.com

Então eu também encontrei este post onde acls são usados, mas eu não consegui fazê-lo funcionar também. Também não tenho certeza se isso funciona para o email que é enviado pelo sistema diretamente (não via SMTP externo) link

Como você resolveria isso?

    
por Florian 29.08.2014 / 11:31

1 resposta

0

depois de um longo dia de tentativas e erros, acabei de descobrir como funciona. Surpreendentemente fácil no restrospecto.

No Debian, certifique-se de ter instalado os pacotes exim4-daemon-heavy para ter suporte a mysql. Eu também suponho que uma configuração dividida é usada (todos os caminhos são relativos a /etc/exim4/conf.d /).

Em seguida, crie o banco de dados com pelo menos uma coluna contendo os endereços de e-mail incluídos na lista negra. Esse cokumn deve ser indexado.

Crie o arquivo main / 50_exim4-config_failmail e coloque as credenciais mysql nele:

hide mysql_servers = MYSQL_HOST/MYSQL_DB/MYSQL_USER/MYSQL_PASS

Além disso, crie router / 050_exim4-config_failmail_router e adicione:

failmail:
  driver = redirect
  data = ${lookup mysql { SELECT '/dev/null' FROM dropmail WHERE email='${local_part}@${domain}'} {$value} }
  file_transport = address_file

É muito importante que o nome do arquivo comece com este 050 porque ele deve ser carregado antes dos outros roteadores. Caso contrário, as regras serão ignoradas. Custou-me algumas horas para descobrir que isso faz uma grande diferença se você nomear o arquivo "50_exim4-config ...". Nesse caso, suas regras são processadas após o conjunto de 400 regras e todas as mensagens de saída já terem sido enviadas.

Esta não é a solução completa do problema original porque simplifiquei um pouco para descobrir o que acontece. Mas, com base nisso, deve ser fácil estender o banco de dados sheme e consultar para corresponder à funcionalidade descrita acima.

    
por 04.09.2014 / 00:03