En linia de comandos podemos obtener el listado de mensajes en la cola de entrega de Postfix mediante el comando postqueue -p. Con eso sabremos si nos encontramos ante un ataque spam o envío de mailing masivo.
Si hemos podido identificar una dirección de origen o destinatario que está provocando que el servidor de correo no funcione, y sólo si se trata de spam o un mailing masivo, procederemos de la siguiente forma:
- Informe estado cola: ante todo extraeremos un informe del estado en el que esta la cola y que justifica la ejecución de estos pasos.
login as: root
root@lx19’s password:
Last login: Wed Jan 24 11:55:24 2007 from 10.10.40.2
[root@lx19]# postqueue -p > /tmp/archivo
- Ejecutaremos script de borrado: existe un script de borrado que borra aquellos mensajes de la cola de correo que contienen una dirección de correo electrónico. Aquí lo ejecutaremos para que borre todos los correos de hnkncouiu@domain.com.
[root@lx19]# cd /data/users/prous
[root@lx19]# ./pfdel.pl
Usage: pfdel <email_address>
[root@lx19]# ./pfdel.pl hnkncouiu@domain.com
postsuper: 53CB145639: removed
postsuper: Deleted: 1 message
postsuper: 5AED4455E4: removed
postsuper: Deleted: 1 message
postsuper: 5FD9E455C2: removed
Añado aquí el script en cuestión:
[root@lx19]$ cat pfdel.pl
#!/usr/bin/perl -w
#
# pfdel – deletes message containing specified address from
# Postfix queue. Matches either sender or recipient address.
#
# Usage: pfdel <email_address>
#use strict;
# Change these paths if necessary.
my $LISTQ = “/usr/sbin/postqueue -p”;
my $POSTSUPER = “/usr/sbin/postsuper”;my $email_addr = “”;
my $qid = “”;
my $euid = $>;if ( @ARGV != 1 ) {
die “Usage: pfdel <email_address>\n”;
} else {
$email_addr = $ARGV[0];
}if ( $euid != 0 ) {
die “You must be root to delete queue files.\n”;
}open(QUEUE, “$LISTQ |”) ||
die “Can’t get pipe to $LISTQ: $!\n”;my $entry = <QUEUE>; # skip single header line
$/ = “”; # Rest of queue entries print on
# multiple lines.
while ( $entry = <QUEUE> ) {
if ( $entry =~ / $email_addr$/m ) {
($qid) = split(/\s+/, $entry, 2);
$qid =~ s/[\*\!]//;
next unless ($qid);#
# Execute postsuper -d with the queue id.
# postsuper provides feedback when it deletes
# messages. Let its output go through.
#
if ( system($POSTSUPER, “-d”, $qid) != 0 ) {
# If postsuper has a problem, bail.
die “Error executing $POSTSUPER: error ” .
“code ” . ($?/256) . “\n”;
}
}
}
close(QUEUE);if (! $qid ) {
die “No messages with the address <$email_addr> ” .
“found in queue.\n”;
}exit 0;