#!/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 = "/opt/zimbra/postfix/sbin/postqueue -p";
 my $POSTSUPER = "/opt/zimbra/postfix/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;
Advertisements