Registro de mensagens devolvidas para um banco de dados (Postfix com domínios virtuais / usuários)

3

Temos uma instalação de postfix com alguns domínios virtuais, cada um com usuários virtuais. Esses domínios e usuários são mapeados usando um banco de dados mysql. Eu tenho até agora rastreamento de saltos, analisando o arquivo de log do postfix. Eu suspeito que deve haver maneiras melhores e mais eficientes de fazer isso. Eu pensei em três, mas não tenho certeza do que é melhor:

  1. Escreva um filtro de conteúdo do Postfix que registre a devolução e jogue fora o e-mail
  2. Use o procmail - mas não tenho certeza de como o procmail funcionaria com usuários virtuais que não têm $ HOME definido
  3. Escreva um script que envie mensagens POP de caixas de correio; analisa e registra-os e exclui o email devolvido

Gostaria de informar sobre qual seria melhor do ponto de vista de manutenção e eficiente de conservar o ponto de vista dos recursos do servidor. Obrigado

    
por Ya. Perelman 27.01.2010 / 20:06

3 respostas

5

Isso tudo pressupõe que você deseja coletar informações sobre rejeições em vez do próprio email devolvido:

Eu tenho praticamente a mesma configuração com os hosts postfix, mysql e virtual. Da perspectiva do recurso de hardware n, a maneira mais eficiente de acompanhar isso é analisar os arquivos de log conforme você está fazendo. Mas se você acha que sua análise é muito grande, você pode usar um aplicativo como o Logwatch para fazer toda a análise para você. Em seguida, configure o Postfix para eliminar os arquivos devolvidos para você.

Agora, se você decidir que deseja coletar esses e-mails em algum lugar, poderá usar essas configurações no arquivo main.cf:

bounce_notice_recipient = [email protected]
error_notice_recipient = [email protected]

E se você quiser que os e-mails sejam completamente destruídos, você pode adicionar um usuário virtual e ajustar seu arquivo de aliases para enviá-los para dev / null

someone: /dev/null

Quanto a um script e um banco de dados eu trabalho muito com PHP e MySQL hoje em dia, então se eu usasse essas ferramentas eu poderia criar algum código php para ler o arquivo de log, procurar pelos saltos e então corrigi-los em um banco de dados. Então eu executei o código antes que o mail.log fosse truncado. Na verdade, vou postar o código aqui depois de escrevê-lo para chutes.

Aqui está algum código se você quer rodar isso com o php / mysql (eu tenho certeza que poderia ser mais bonito):

<?php
#parse_logs.php
# load local file into array
$val = file("mail.log");

$pattern = '/status=bounced/';

foreach ($val as &$value) {
if (preg_match($pattern,$value)) {
        $a = split('[<>]', $value);

       //if you prefer you can also use: preg_match_all('/<(.*)>/', '$value', $matches);
       #can be helpful to print the following to the screen during tests
       # echo $a[1];

        // Make a MySQL Connection
        mysql_connect("localhost", "username", "password") or die(mysql_error());
        mysql_select_db("postfix_db") or die(mysql_error());

        // Insert a row of information into the table "example"
        mysql_query("INSERT INTO emails (emailaddress) VALUES('$a[1]') ") 
        or die(mysql_error());  

        #again, if you want to see while running manually from cli
        #echo "Data Inserted!";

}
#again, if you want to see while running manually from cli
#echo "\n";
}

?>

Você poderia, então, disparar um cron imediatamente antes de seu mail.log ser configurado para ser reciclado ou limpar o log quando o cron for acionado.

Parece um grande esforço para acompanhar os endereços de e-mail de e-mails devolvidos. Você precisará escrever consultas mysql para acessar essas informações, é claro.

Você também pode pular as coisas do mysql completamente e apenas canalizar os resultados para um arquivo de teste ou um endereço de e-mail (e também pode usar um cron)

php parse.php > results.txt

ou

php parse_logs.php | /usr/sbin/sendmail [email protected]
    
por 27.01.2010 / 23:11
0

Eu não tenho um exemplo, já que eu nunca tentei fazer isso, mas você poderia usar o syslog-ng (dependendo da sua plataforma) e criar um filtro. O filtro tem uma opção para executar uma correspondência de expressão regular na própria mensagem. Tudo que você precisa fazer é enviá-lo para um destino específico, esse destino seria o mysql. Uma pesquisa rápida lhe dirá como configurar o syslog-ng para o mysql, e alguns ajustes provavelmente lhe darão um filtro para enviar para aquele destino.

    
por 14.03.2011 / 00:57
0

Você pode canalizar as notificações de rejeição para um script. Apenas como uma visão geral de como você pode implementá-lo:

/etc/postfix/main.cf

notify_classes = bounce, 2bounce, resource, software
[email protected]
[email protected]

/ etc / postfix / transport

[email protected]     bouncepipe:

/etc/postfix/master.cf

bouncepipe   unix  -       n       n       -       -       pipe
      flags=DRhu user=list argv=/etc/postfix/bouncepipe.pl

/etc/postfix/bouncepipe.pl

#!/usr/bin/perl                                                                                                                                                                                                                                                                       

my $message = '';
my $sender = '';
my $recipient = '';

foreach $line ( <STDIN> )
{
    $message .= $line;
    chomp( $line );
    if ( $line =~ /Final-Recipient: /)
    {
        my $index = index($line, ';');
        $recipient = substr($line, $index+2);
    }
    if ( $line =~ /X-Postfix-Sender: /)
    {
        my $index = index($line, ';');
        $sender = substr($line, $index+2);
    }
}
# Do whatever you need to do with $sender and $recipient
    
por 30.01.2018 / 18:00