Analisar cabeçalhos de mensagens não entregues (correspondência devolvida)


9

Qual é a melhor maneira de analisar os cabeçalhos dos emails devolvidos (não entregues) que são enviados de volta ao meu servidor e determinar se é um retorno suave ou difícil?

Só envio emails de aceitação para meus usuários, mas ocasionalmente alguns endereços de email ficam obsoletos. Quando um e-mail retorna ao meu servidor, eu gostaria de descobrir por que ele retornou (suave / difícil). Depois, posso lidar com isso adequadamente no meu banco de dados e / ou sinalizar o usuário para atualizar seu email quando o próximo logon for feito.

Estou usando o Ubuntu e o Postfix. Eu implementei o VERP com alias e alias virtuais. Portanto, os e-mails devolvidos têm um caminho de retorno de bounce+OrigEmailAddress@example.com , e eu posso canalizá-los para um script.

Agora que tenho a configuração do VERP, sei para quem o email original foi enviado, mas preciso analisar os cabeçalhos de email retornados para descobrir se é um salto suave ou forte.

Qual a melhor forma de lidar com isto? Pelo que entendi, nem todos os servidores de correio jogam pelas mesmas regras, e os cabeçalhos podem ter uma variedade de formatos. Existe algum projeto de código aberto que monitore esses tipos de coisas? Algo simples que eu possa implementar que categorize a maioria dos saltos corretamente?

Estou tentando proteger a reputação do meu servidor de email, então qualquer ajuda é muito apreciada!

Respostas:


9

Como o RFC3463 explica, os códigos de status começando com 5 são usados ​​para falhas permanentes e 4 para falhas transitórias persistentes. Em vez de tentar analisar várias mensagens com diferentes formatos, você pode confiar nos logs do servidor e tentar algo como isto:

grep " dsn=5." /var/log/mail.log | grep -o -P " to=<(.+?)>" | sort | uniq -c

Isso encontrará erros permanentes no mail.log (formato Postfix) e fornece os endereços e a quantidade de rejeições em cada endereço. Você também pode usar "dsn = 4". para obter endereços com erros temporários.


Obrigado Esa! Não sabia que o postfix tinha essas informações no log de mensagens. Essa é a solução que você usa? Você acha que o postfix categoriza os hard bounces dsn = 5 corretamente? Eu li que alguns servidores de email não estão em conformidade com o RFC. Por isso, pensei que poderia ser necessária uma solução mais complicada. Qual foi sua experiência? Esta parece ser uma boa solução se podemos testar postfix para acertar :-)
Richard

Script realmente útil - obrigado! Receita aqui para uma alternativa ao sinalizador -P do grep (para usuários de Mac, etc.): unix.stackexchange.com/a/437694/275762 grep " dsn=5." /var/log/mail.log | pcregrep -o1 " to=<(.+?)>" | sort | uniq -c
Peter M.

8

Geralmente existem dois tipos de rejeições

  1. As devoluções causadas pela rejeição direta do servidor de correio remoto quando o seu postfix entrega o email.
  2. As devoluções causadas pelo servidor remoto (servidor do próximo salto após o seu postfix) não conseguem entregar a mensagem aos destinatários finais.

O primeiro caso já foi coberto pela excelente resposta de Esa Jokinen acima. Sua melhor aposta é analisar o maillog.

O segundo caso foi um caso especial de rejeições. O cenário de exemplo:

  • Você envia um email com o destinatário fakemail@example.com para o servidor mail.example.com .
  • Em mail.example.com, fakemail@example.com era alias para realmail@example.net e deve ser encaminhado para mail.example.net .
  • Um dia o mail.example.net rejeita a sua mensagem, para que o mail.example.com precise enviar devoluções ao seu servidor.
  • Infelizmente, o maillog em seu servidor terá "dsn = 2" porque mail.example.com já aceitou a mensagem, mas não conseguiu encaminhá-la para mail.example.net .

Aqui, o exemplo do segundo tipo rejeita o email. Existe uma regra de encaminhamento do servidor de e-mail do Yahoo myuser@yahoo.com -> myuser@example.net . Infelizmente o servidor de email do example.net rejeita a mensagem :(

From MAILER-DAEMON  Thu Mar  5 05:07:26 2015
Return-Path: <>
X-Original-To: noreply-myuser=yahoo.com@example.org
Delivered-To: noreply-263462085117-1425506829-myuser=yahoo.com@example.org
Received: from nm21-vm7.bullet.mail.gq1.yahoo.com (nm21-vm7.bullet.mail.gq1.yahoo.com [98.136.217.54])
        (using TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits))
        (No client certificate requested)
        by mx.example.org (Postfix) with ESMTPS id D6365565FC
        for <noreply-263462085117-1425506829-myuser=yahoo.com@example.org>; Thu,  5 Mar 2015 05:07:25 +0700 (WIT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=bounce; t=1425506842; bh=zk/tWZNl6c36dmlPDmakM9ekK8cHVJANXMmSdsbkcWc=; h=From:To:Date:Subject:From:Subject; b=Im95h1qTg6qN3yUI7vF1fXtJ0SbUnzv8rUPwLbpNwxGPN2p8wfosXJzQgJ3nzr4L4ZQ50P2d9E9U4jEUNtnyi7nlFd5kKbtiVuda4H56h1PFnt+7wSpgHcd5Irs/lLODumb6ZZSEpCOWttcB9+JLaDfEUUPjGcbR+xww4XeH5Eo=
From: MAILER-DAEMON@yahoo.com
To: noreply-263462085117-1425506829-myuser=yahoo.com@example.org
Date: Wed, 04 Mar 2015 22:07:22 -0000
Subject: Failure Notice
X-Yahoo-Newman-Property: bmbounce

Sorry, we were unable to deliver your message to the following address.

<myuser@example.net>:
Remote host said:
550 5.1.1 User unknown
 [RCPT_TO]

Nesse caso, seu único método é analisar a mensagem de devolução. Infelizmente, não há formato de rejeição padrão, portanto, você deve analisar o corpo e determinar a rejeição causada.

A lista de verificação de recursos da análise de devolução do postfix:

  1. Verifique se o endereço VERP era válido. Você não deseja analisar mensagens inválidas.
  2. Analise o corpo, determine se eles são rejeição suave ou dura.

Para o segundo recurso, você pode pesquisar no Google alguma mensagem de rejeição comum. O exemplo é este bounce-regex-list.xml de Jakub Liska .


Esa Jokinen fez uma boa observação no comentário abaixo sobre esses dois tipos de rejeição. Se seu objetivo é manter a reputação do servidor, a negociação do primeiro tipo de rejeição deve ser suficiente. O segundo salto foi sobre como limpar suas listas. Portanto, o e-mail morto deve ser apagado, liberando alguns recursos em seu servidor.

Alguns gerenciadores de listas de discussão, como PHPlist e Mailman, também lidam com esse problema de rejeição ao analisar o corpo do email, pois eles não têm recursos para analisar o maillog.


1
Essa solução é útil e mais completa se for necessário lidar também com os emails encaminhados automaticamente para outro endereço. No entanto, se o objetivo é proteger a reputação do servidor de email, o tratamento de rejeições diretas deve ser suficiente. Os administradores do MTA de encaminhamento devem remover encaminhamentos e listas de correio desatualizados (para proteger sua reputação e evitar tráfego desnecessário). Depois disso, estamos de volta ao primeiro caso. O OP deve usar esta solução se a quantidade de rejeições secundárias for significativa. O que exige menos esforço.
Esa Jokinen

@masegaloeh, obrigado pela informação! Eu nem tinha considerado essa situação de encaminhamento como uma possibilidade! No momento, estou preocupado principalmente com a proteção do representante do meu servidor de email, mas se os saltos aumentarem, isso pode ser muito útil.
Richard
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.