.png)
Tenemos una instalación de postfix con un par de dominios virtuales cada uno con usuarios virtuales. Estos dominios y usuarios se asignan mediante una base de datos mysql. Hasta ahora he estado rastreando los rebotes analizando el archivo de registro de postfix. Sospecho que debe haber formas mejores y más eficientes de hacer esto. Pensé en tres pero no estoy seguro de cuál es mejor:
- Escriba un filtro de contenido Postfix que registre el rebote y deseche el correo
- Utilice procmail, pero no estoy seguro de cómo funcionaría procmail con usuarios virtuales que no tienen $HOME definido
- Escriba un script que envíe mensajes POP desde los buzones de correo; los analiza, los registra y elimina el correo electrónico devuelto
Agradecería consejos sobre cuál sería mejor desde el punto de vista del mantenimiento y eficiente desde el punto de vista de la conservación de los recursos del servidor. Gracias
Respuesta1
Todo esto supone que deseas recopilar información sobre los rebotes en lugar del correo electrónico devuelto en sí:
Tengo prácticamente la misma configuración con postfix, mysql y hosts virtuales. Desde la perspectiva de los recursos de hardware, la forma más eficaz de realizar un seguimiento de esto es analizar los archivos de registro mientras lo hace. Pero si cree que la forma en que está analizando es una carga demasiado grande, puede usar una aplicación como Logwatch para hacer todo el análisis por usted. Luego configure Postfix para deshacerse de los archivos devueltos por usted.
Ahora, si decide que realmente desea recopilar estos correos electrónicos en algún lugar, puede usar esta configuración en el archivo main.cf:
bounce_notice_recipient = [email protected]
error_notice_recipient = [email protected]
Y si desea que los correos electrónicos se destruyan por completo, puede agregar un usuario virtual y ajustar su archivo de alias para enviarlos a dev/null.
someone: /dev/null
En cuanto a un script y una base de datos, trabajo mucho con PHP y MySQL estos días, por lo que si usara esas herramientas podría crear un código PHP para leer en el archivo de registro, buscar los rebotes y luego enviarlos directamente a una base de datos. . Luego ejecutaba el código antes de que se truncara mail.log. De hecho, publicaré el código aquí después de escribirlo por diversión.
Aquí hay un código si desea ejecutar esto con php/mysql (estoy seguro de que podría ser más 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";
}
?>
Luego, podría iniciar un cron justo antes de que su mail.log esté configurado para ser reciclado o borrar el registro una vez que se inicie el cron.
Parece un gran esfuerzo realizar un seguimiento de las direcciones de correo electrónico de los correos electrónicos devueltos. Por supuesto, necesitará escribir consultas MySQL para luego acceder a esta información.
También puedes saltarte las cosas de mysql por completo y simplemente canalizar los resultados a un archivo de prueba o una dirección de correo electrónico (y también puedes usar un cron)
php parse.php > results.txt
o
php parse_logs.php | /usr/sbin/sendmail [email protected]
Respuesta2
No tengo un ejemplo, ya que nunca intenté hacerlo, pero puedes usar syslog-ng (dependiendo de tu plataforma) y crear un filtro. El filtro tiene una opción para realizar una coincidencia de expresiones regulares en el mensaje mismo. Todo lo que necesitas hacer es enviarlo a un destino específico, ese destino sería mysql. Una búsqueda rápida le indicará cómo configurar syslog-ng en mysql, y algunos ajustes probablemente le proporcionarán un filtro para enviar a ese destino.
Respuesta3
Puede canalizar notificaciones de rebote a un script. Solo como una descripción general de cómo puede implementarlo:
/etc/postfix/main.cf
notify_classes = bounce, 2bounce, resource, software
[email protected]
[email protected]
/etc/postfix/transporte
[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