Como coletar rejeições no postfix

15

Isso está relacionado a esta pergunta:

linux - Maneiras de obter um relatório de retorno para o meu aplicativo de boletim informativo? - Falha no servidor

Digamos que estou gerando endereços de e-mail como este quando envio boletins para identificar devoluções e cancelá-las da minha newsletter: [email protected]

Eu suponho que eu usaria isso no caminho de retorno, certo?

Então, como eu o configuraria no postfix para coletar todos esses endereços prefixados com "bounce-" em uma caixa de correio?

Finalmente, ouvi as pessoas mencionarem um salto suave vs. um salto duro. Alguém pode explicar o diferente e como eles devem ser contados para saber quando remover alguém permanentemente de um boletim por e-mail?

Brian Armstrong
fonte
Observe que um endereço de e-mail que inclua a palavra "rejeição" também pode ser visto como "eca" ... (spam) - isto é, se você pode colocar seu próprio nome Message-Idno cabeçalho, ele deve ser enviado de volta e isso basta verificar quem é quem.
Alexis Wilke

Respostas:

17

A resposta exata à sua pergunta (manipulação do [email protected]endereço) depende de como o servidor está configurado para receber email. Se example.comfor o domínio virtual, o melhor que você pode fazer é coletar as mensagens na [email protected]caixa de correio (supondo recipient_delimiter = -).

Se example.comé o domínio entregue localmente para o servidor (o correio é entregue nas contas reais do sistema), você pode adicionar um .forwardarquivo ao diretório inicial do bounceusuário, que é entregue a um programa que analisa as informações de devolução e as registra em um banco de dados ou arquivo . Consulte man localpara obter mais informações sobre o .forwardformato e como enviar para um programa.

O que fazemos, desde que enviamos mensagens para um grande número de domínios, é usado bounces.example.comcomo nosso domínio VERP. Este domínio precisa ser adicionado a relay_domains. Crie /etc/postfix/transport_mapscom este conteúdo:

bounces.example.com             bulkbounce:

Em seguida, acrescente uma linha semelhante a esta /etc/postfix/master.cf:

bulkbounce unix - nn - - pipe
  user = ninguém argumento = / usr / local / bin / bounce_handler.py $ {destinatário}

O bounce_handler.pyscript aceita o endereço VERP como sua opção de linha de comando, analisa-o e faz as atualizações necessárias no banco de dados para registrar o retorno.

Insyte
fonte
Ooh, eu gosto da ideia de usar o delimitador de destinatários para agrupá-los. Normalmente, um + é usado, certo? Eu acho que vai funcionar muito bem, obrigado!
31909 Brian Armstrong
11

Na verdade, a resposta do Instyle é muito difícil de implementar se você deseja dar suporte a muitos domínios diferentes e está errado porque:

a) Com o exemplo dele transport_maps, todos os emails enviados para esse domínio são enviados para esse serviço específico, independentemente de os emails serem devolvidos ou não. Como ele usa um nome de domínio específico, na verdade deve ser apenas emails devolvidos ... mas não pode ser garantido dessa maneira.

b) Os dados enviados ao seu script são o próprio email e não a mensagem de devolução. Em outras palavras, seu código pode não ter idéia do motivo pelo qual o email foi devolvido (por exemplo, o reembolso local enviará apenas o email original).


A maneira correta de fazer essa configuração no postfix é usar a classe de notificação de rejeição.

1) Em /etc/postfix/main.cf

notify_classes = bounce
bounce_notice_recipient = [email protected]
transport_maps = hash:/etc/postfix/transport_maps

2) Em / etc / postfix / transport_maps

# when you make changes to this file, run:
#   sudo postmap /etc/postfix/transport_maps
[email protected] bulkbounce:

Como você pode ver, agora dizemos ao postfix para uso [email protected]sempre que um email for devolvido. Em seguida, no mapa de transporte, use-o bulkbouncecomo serviço para manipular qualquer endereço de email [email protected].

Finalmente, você pode definir bulkbouncecom seu script:

3) Em /etc/postfix/master.cf

bulkbounce unix -       n       n       -       -       pipe
  flags=FRq user=bounce argv=/home/bounce/bin/snapbounce --sender ${sender} --recipient ${recipient}

Este script requer que você tenha um usuário. nobodyé uma boa escolha também. Se você deseja ter um usuário específico, pode criá-lo com:

useradd bounce

Sem o script master.cf, os e-mails são enviados para a conta de conversão em massa. Portanto, se você tiver um script que analise e-mails de arquivos, isso funcionaria sem as alterações transport_mapse master.cf.


De um comentário abaixo:

fyi - re: double bounces ...
se você estiver modificando o endereço de retorno (endereço VERP como [email protected], então você desejará comentar a linha main.cfpara o bounce_notice_recipient, se você estiver interessado em analisar o +idretorno apenas em seu script.

Alexis Wilke
fonte
De alguma forma, recebo o retorno duas vezes, uma vez com retorno + id @ ... e uma vez com retorno @ ... do retorno duplo - (o retorno do usuário não existe atualmente no sistema - pois não pretendo 'salvar' esses e-mails). O email é enviado com um Return-path of bounce + id @ ... Alguma idéia do que estou perdendo?
RVandersteen
@RVandersteen Eu não tenho muita certeza do porquê de receber duas vezes. Aquele com +id@pode ser um envelope de algum tipo?
Alexis Wilke
Quando eu uso nosso endereço 'de' padrão - o retorno ainda é enviado para [email protected] e [email protected] (nenhum caminho de retorno adicionado mais) #
RVandersteen 16/17/17
1
Para referência futura, adicionar o notify_classes não altera o comportamento do MTA enviando a mensagem de rejeição para o caminho FROM / Return. Ele adiciona comportamento em cima dele (também o envia ao notify_bounce_recipient). É por isso que recebi e-mails duplos. O que responde às minhas perguntas acima
RVandersteen 17/17/17
1
fyi - re: double bounces .. se você estiver modificando o endereço de retorno (endereço VERP como '[email protected]', você deverá comentar a linha em main.cf referente ao 'bounce_notice_recipient', Se você estiver interessado em analisar o salto + id apenas em seu script.
sarora
1

A maioria dos softwares modernos de lista de mala direta já sabe como lidar com mensagens VERP se o MTA estiver configurado corretamente para transmiti-las ao software de mala direta. No caso do GNU Mailman, você deve consultar a página de perguntas e respostas apropriadamente chamada "Como uso o VERP com um delimitador (Postfix container_delimiter)?".

Se você está criando seu próprio software de boletim personalizado para lidar com isso, deve se perguntar por que está reinventando a roda em vez de usar aplicativos existentes que podem lidar com a tarefa de maneira simples e fácil para você.

Jeremy Bouse
fonte
Sim, estou criando meu próprio software de boletim informativo. Há uma boa razão!
31909 Brian Armstrong
Então você deve usar o VERP para lidar com os devoluções corretamente.
Jeremy Bouse
Olá Jeremy, acho que você está certo O VERP é a solução padrão aqui, embora pareça útil apenas identificar o remetente e o destinatário. Nesse caso, também precisamos identificar a mensagem específica que causou a devolução, então acredito que teremos que fazer uma solução personalizada com nosso próprio ID no endereço. Acho que a solução mencionada abaixo, usando um delímetro de destinatário, nos permitirá agrupá-los em uma conta de devolução. Obrigado pela resposta, mas agradeço a ajuda!
31909 Brian Armstrong
A solução da Insyte é apenas um VERP modificado em sua essência. Você só precisa garantir que ele forneça um identificador exclusivo o suficiente para o seu manipulador de rejeição identificá-lo. Na maioria dos softwares de mala direta, esse é o endereço de email, mas pode ser qualquer coisa, já que você está criando o seu próprio.
Jeremy Bouse