.png)
Temos uma instalação 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. Até agora, tenho rastreado rejeições analisando o arquivo de log do postfix. Suspeito que deva haver maneiras melhores e mais eficientes de fazer isso. Pensei em três, mas não tenho certeza do que é melhor:
- Escreva um filtro de conteúdo Postfix que registre a devolução e jogue fora o e-mail
- Use o procmail - mas não tenho certeza de como o procmail funcionaria com usuários virtuais que não possuem $HOME definido
- Escreva um script que faça POPs de mensagens de caixas de correio; analisa e registra-os e exclui o e-mail devolvido
Eu gostaria de receber conselhos sobre o que seria melhor do ponto de vista da manutenção e eficiente do ponto de vista da conservação dos recursos do servidor. Obrigado
Responder1
Tudo isso pressupõe que você deseja coletar informações sobre devoluções em vez do e-mail devolvido em si:
Eu tenho praticamente a mesma configuração com postfix, mysql e hosts virtuais. Da perspectiva dos recursos de hardware, a maneira mais eficiente de controlar isso é analisar os arquivos de log enquanto você está fazendo. Mas se você acha que a análise é muito pesada, você pode usar um aplicativo como o Logwatch para fazer toda a análise para você. Em seguida, configure o Postfix para descartar os arquivos devolvidos para você.
Agora, se você decidir que realmente 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 atualmente, então se eu usasse essas ferramentas eu poderia criar algum código php para ler no arquivo de log, procurar as rejeições e depois corrigi-las em um banco de dados . Então eu executaria o código antes que mail.log fosse truncado. Na verdade, vou postar o código aqui depois de escrevê-lo, por diversão.
Aqui está um código se você quiser rodar isso com php/mysql (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ê pode então disparar um cron logo antes de seu mail.log ser configurado para ser reciclado ou limpar o log assim que o cron for disparado.
Parece ser um grande esforço manter o controle dos endereços de e-mail dos e-mails devolvidos. Você precisará escrever consultas mysql para acessar essas informações, é claro.
Você também pode pular completamente o material do mysql 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]
Responder2
Não tenho exemplo, pois nunca tentei fazer isso, mas você poderia usar o syslog-ng (dependendo da sua plataforma) e criar um filtro. filter tem a opção de realizar uma correspondência de regex na própria mensagem. Tudo que você precisa fazer é enviá-lo para um destino específico, esse destino seria mysql. Uma pesquisa rápida lhe dirá como configurar o syslog-ng para mysql, e alguns ajustes provavelmente fornecerão um filtro para enviar para esse destino.
Responder3
Você pode canalizar notificações de devoluçã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