Qui di seguito due script molto utili per la cancellazione di gruppi di email dalla coda di posta di un server Linux con MTA Postfix specificando l’indirizzo mittente o una regular expression specificata come primo argomento allo script.

Per controllare lo stato della coda email, guardare questo How-to

Cancellazione email – Regexp

#!/usr/bin/perl

$REGEXP = shift || die "no email-adress given (regexp-style, e.g. bl.*\@yahoo.com)!";

@data = qx</usr/sbin/postqueue -p>;
for (@data) {
  if (/^(\w+)(\*|\!)?\s/) {
     $queue_id = $1;
  }
  if($queue_id) {
    if (/$REGEXP/i) {
      $Q{$queue_id} = 1;
      $queue_id = "";
    }
  }
}

#open(POSTSUPER,"|cat") || die "couldn't open postsuper" ;
open(POSTSUPER,"|postsuper -d -") || die "couldn't open postsuper" ;

foreach (keys %Q) {
  print POSTSUPER "$_\n";
};
close(POSTSUPER);

Per esempio, per cancellare dalla coda tutte le email provenienti dal dominio chiamato fackspamdomain.com, lo script in perl dovrà essere richiamato nel seguente modo (in questo esempio ho dato il seguente nome al file postfix-delete.pl):

./postfix-delete.pl fackspamdomain.com

Per cancellare dalla coda tutte le email contenenti una certa parola “xyz” nell’indirizzo mittente, lo script dovrà essere richiamato nel seguente modo:

./postfix-delete.pl xyz

Cancellazione email – indirizzo mittente

#!/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;

Per cancellare dalla coda tutte le email provenienti da un indirizzo mittente chiamato [email protected], lo script in perl dovrà essere richiamato nel seguente modo (in questo esempio ho dato il seguente nome al file postfix-delete-2.pl):

./postfix-delete-2.pl [email protected]