diff --git a/remove_emailaddress_from_queue.pl b/remove_emailaddress_from_queue.pl new file mode 100755 index 0000000..21c2fe7 --- /dev/null +++ b/remove_emailaddress_from_queue.pl @@ -0,0 +1,61 @@ +#!/usr/bin/perl -w +# +# pfdel - deletes message containing specified address from +# Postfix queue. Matches either sender or recipient address. +# +# Usage: pfdel +# + +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 \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 = ; # skip single header line +$/ = ""; # Rest of queue entries print on + # multiple lines. +while ( $entry = ) { + 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;