Postfix: passar uma cópia de um email para um script, mas entregar o original para a caixa de correio

1

Na verdade, é bem simples: eu quero passar todos os e-mails recebidos para um script PHP, mas apenas como uma cópia, o e-mail original ainda será entregue à caixa de correio como de costume.

Eu simplesmente não consigo fazer funcionar. Eu tentei o seguinte

(1) Criado um apelido catchall (mysql):

@mydomain.tld   [email protected]

(2) Criamos um mapeamento de transporte regex em /etc/postfix/mailpipe.cf (basicamente significa: aplicar a todos os emails de mydomain.tld)

/.*@mydomain\.tld/   mailpipe:

(3) integra tudo em /etc/postfix/main.cf:

transport_maps = ... regexp:/etc/postfix/mailpipe.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/....

(4) Adicionado o transporte para /etc/postfix/master.cf:

mailpipe   unix  -       n       n       -       -       pipe
  flags=FR user=localuser argv=/path/to/my/script.php
  ${nexthop} ${user}

O script:

#!/usr/bin/php -q
<?php
  $file = '/home/localuser/pipe/log.log';
  $input = file_get_contents('php://input');
  file_put_contents($file, $input, FILE_APPEND | LOCK_EX);

Assim, a configuração parece funcionar, o script é atingido nos e-mails recebidos, mas o $input está vazio (embora funcione com qualquer outra string). O email está sendo processado e depois removido / descartado. Então, aqui estão minhas 2 perguntas:

  1. Como posso acessar o conteúdo do email a partir do script?

  2. Como posso evitar que o email seja descartado após o processamento? Existe uma maneira de passar uma cópia para a caixa de entrada como de costume e outra para o script para processamento?

por Quasdunk 05.09.2013 / 16:32

1 resposta

6

Isso pode ser feito usando-se recipient_bcc_maps para o BCC de todos os e-mails para um endereço somente local configurado para rotear para o seu script.

Adicione a seguinte linha ao / etc / postfix / recipient_bcc. Execute "postmap / etc / postfix / recipient_bcc" após a conclusão da edição. Isso diz ao Postfix para o BCC todos os emails em que o domínio corresponde a "@ yourdomain.tld" ao endereço "robotscript @ localhost".

@yourdomain.tld  robotscript@localhost

Adicione a seguinte linha ao / etc / postfix / transport. Execute "postmap / etc / postfix / transport" após a conclusão da edição. Isso diz ao Postfix que os e-mails destinados ao endereço "robotscript @ localhost" devem ser entregues diretamente neste servidor e não retransmitidos em outro lugar.

robotscript@localhost :

Adicione as seguintes linhas ao /etc/postfix/main.cf para que o Postfix use as configurações inseridas acima.

recipient_bcc_maps = hash:/etc/postfix/recipient_bcc
transport_maps = hash:/etc/postfix/transport

Certifique-se de que o parâmetro "mydestination" em /etc/postfix/main.cf inclua o valor "localhost".

Adicione a seguinte linha ao / etc / aliases. Execute "postalias / etc / aliases" após a conclusão da edição. Isto é o que realmente passa e-mails destinados a "robotscript @ localhost" para o seu script PHP. Seu script deve estar configurado para ler o conteúdo do email da STDIN.

robotscript: "|/path/to/your/php_script.php"

Reinicie o Postfix e todos os seus e-mails deverão ser copiados para o seu script, assim como entregues no endereço do destinatário original.

    
por 05.09.2013 / 20:03