Como configuro o postfix para armazenar e-mail em um arquivo em vez de retransmiti-lo?

9

Eu quero executar uma cópia de teste de um servidor de produção em um ambiente local. O sistema executa um aplicativo PHP, que envia e-mails aos clientes em vários cenários, e quero garantir que nenhum e-mail seja enviado do ambiente de preparação.

Eu posso ajustar o código para que ele use um remetente de e-mail falso, mas eu gostaria de executar exatamente o mesmo código que o ambiente de produção. Eu posso usar um MTA diferente (o Postfix é apenas o que usamos na produção), mas eu gostaria de algo que seja fácil de configurar no Debian / Ubuntu:)

Portanto, gostaria de configurar a instalação local do Postfix para armazenar todos os e-mails em (um ou mais) arquivos em vez de retransmiti-los. Na verdade, eu não me importo como é armazenado, desde que seja possível verificar o e-mail que foi enviado. Mesmo uma opção de configuração que informa ao postfix para manter o e-mail na fila de e-mails funcionaria (eu posso limpar a fila quando recarregar o servidor de armazenamento temporário com uma cópia da produção).

Sei que isso é possível, mas não encontrei nenhuma boa solução on-line para o que parece ser uma necessidade bastante comum.

Obrigado!

    
por GomoX 22.11.2012 / 14:56

5 respostas

12

Eu criei um novo transporte com um comando pipe que escreve e-mail para um arquivo.

Basicamente:

  1. Crie um usuário que possua e-mail (ou use um existente). Eu chamei o meu email
  2. mkdir /home/email/bin
  3. Coloque o script a seguir em /home/email/bin/mail_eater (isso usa PHP, mas você pode escrever sua própria versão em qualquer idioma que desejar, basta anexar stdin a um arquivo):

    #!/usr/bin/php
    <?php
    $fd = fopen("php://stdin", "r");
    $email = "";
    while (!feof($fd)) {
        $email .= fread($fd, 1024);
    }
    fclose($fd);
    $fh = fopen('/home/email/email.txt','a');
    fwrite($fh, $email."\n-------------------------------------------------------\n\n");
    fclose($fh);
    
  4. chmod a+x /home/email/bin/mail_eater
  5. touch /home/email/email.txt
  6. chmod a+r /home/email/email.txt
  7. Crie um novo transporte usando esse arquivo, acrescentando a seguinte linha em master.cf :

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
  8. Use isso como o transporte padrão em main.cf :

    default_transport = file_route
    

Lá:)

    
por 22.11.2012 / 16:35
3

Você pode colocar esses domínios em $mydestination em main.cf , então o postfix entregará localmente.

Você pode configurar usuários locais diferentes, se quiser, ou pode configurar um endereço pega-tudo local para entregar e-mails em apenas uma conta, mais detalhes aqui: link

Para todos os domínios:

mydestination = pcre:/etc/postfix/mydestinations

e /etc/postfix/mydestinations devem conter

/.*/    ACCEPT

Não posso testar agora, mas deve funcionar.

    
por 22.11.2012 / 15:14
2

tente (em main.cf):

defer_transports = smtp

você pode ver a fila postqueue -p e assistir ao conteúdo com postcat

    
por 22.11.2012 / 16:18
0

Dependendo da sua distribuição, você pode olhar para "nullmailer". Este é um MTA de retransmissão, que transmite para outro SMTP na sua rede ou remoto. Isso poderia muito bem ser um SMTP inválido e, nesse caso, provavelmente só o colocaria em uma fila em uma pasta na máquina.

No debian e ubuntu isso está disponível como um MTA de substituição para o seu sistema.

    
por 22.11.2012 / 16:44
0

Isso é copiado e ligeiramente modificado do meu blog link :

Você nem precisa configurar o Postfix para atuar como um nullmailer. O postfix vem com uma ferramenta legal chamada smtp-sink , que faz o truque. O smtp-sink destina-se principalmente a funcionar como uma ferramenta de teste para clientes SMTP que precisam de um servidor para brincar. Assim, você pode configurá-lo para registrar toda a conversa ou até mesmo enviar cada mensagem recebida para um arquivo. O último é necessário para um nulificador.

Não há arquivo de configuração para configurar o smtp-sink. Tudo é feito por meio de opções de linha de comando.

smtp-sink -c -d "%Y%m%d%H/%M." -f . -u postfix -R /tmp/ -B "550 5.3.0 The recipient does not like your mail. Don't try again." -h spamtrap.example.com 25 1024

Vamos dar uma olhada mais de perto em cada parâmetro.

-u postfix
Runs the program under the user "postfix"
-R /tmp/
Sets the output directory to /tmp/. In this directory the mails will be stored. If you have a high spam volume (hundreds of Spam per minute) it is recommended to write the mails to a ramdisk
-d "%Y%m%d%H/%M."
Writes the mail to a directory of the format "YearMonthDayHour" and in this directory the files are name "Month.RandomID". Note that the dates are in UTC
-c
Write statistics about connection counts and message counts to stdout while running
-f .
Reject the mail after END-OF-DATA. But the mail will be saved. Cool, isn't it?!
-B "550 5.3.0 The recipient does not like your mail. Don't try again"
This is the rejection message after END-OF-DATA.
-h spamtrap.example.com
Announce the hostname spamtrap.example.com
25
The port to listen on. Can be prepended with an IP or host if you want to bind on a special interface.
1024
The backlog count of connections that can wait in the TCP/IP stack before they get a free slot for sending mail.

Você pode encontrar mais informações na página man do smtp-sink, mas estas são as mais importantes para executar um spamtrap. Nesta configuração, o programa aceita qualquer email com qualquer tamanho de qualquer remetente para qualquer destinatário com IPv4 e IPv6. As únicas restrições são que existem apenas 256 conexões simultâneas possíveis com 1024 conexões enfileiradas e o programa é marcado como experimental. Portanto, não use o smtp-sink em um ambiente de produção.

A opção -B só é válida em versões mais recentes do Postfix. Em 2.7.1 está faltando. Em 2.8.2 está presente. Em algum lugar entre isso foi introduzido.

    
por 23.11.2012 / 17:35