Mails aus der queue entfernen

0

Nachdem der Mailserver eines unserer Kunden ca. 30.000 Warnmails aufgrund eines SCSI-Fehlers beim Backup an uns geschickt hatte bekam unser Mailserver so einiges zu tun und es stellte sich die Frage: Was nu?Als erstes mal die Mailverarbeitung stoppen

postsuper -h ALL

Nun die Ausgabe der postqueue umformatieren, da zwei Zeilen schlecht zu verarbeiten sind

alias mq='mailq | grep "^[^[:space:]]" | grep -v "^-"'

… nun die Ausgabe auf die betroffene eMail Adresse einschränken

mq | grep -i "user@domain.tld"

Da die eMails je den Status hold haben, kann man einfach alles nach dem ! verwerfen

mq | grep -i "user@domain.tld" |cut -f1 -d'!'

… zum Schluss das ganze in einen neuen Befehl umwandeln

mq | grep -i "user@domain.tld" |cut -f1 -d'!' | xargs -n 1 postsuper -d
. . . 

habe gerade ein script gefunden, dass das ganze vereinfacht. Wie immer findet man so etwas immer erst hinterher . . .

#!/usr/bin/perl -w
#
# pfdel - Löscht Nachrichten mit einer bestimmten Adresse aus der
# Postfix-Queue. Prüft Sender- und Empfänger-Adresse.
#
# Verwendung: pfdel <E-Mail-Adresse>
#
use strict;
# Pfade bei Bedarf anpassen.
my $LISTQ = "/usr/sbin/postqueue -p";
my $POSTSUPER = "/usr/sbin/postsuper";
my $email_addr = "";
my $qid = "";
my $euid = $>;
if ( @ARGV != 1 ) {
die "Verwendung: pfdel <E-Mail-Adresse>n";
} else {
$email_addr = $ARGV[0];
}
if ( $euid != 0 ) {
die "Nur root kann Queue-Dateien löschen.n";
}
open(QUEUE, "$LISTQ |") ||
die "Kann keine Pipe mit $LISTQ herstellen: $!n";
my $entry = <QUEUE>; # Einzelne Headerzeile überspringen
$/ = ""; # Restliche Queue-Einträge sind auf
# mehrere Zeilen verteilt.
while ( $entry = <QUEUE> ) {
if ( $entry =~ / $email_addr$/m ) {
($qid) = split(/s+/, $entry, 2);
$qid =~ s/[*!]//;
next unless ($qid);
#
# postsuper -d mit der Queue-ID ausführen.
# postsuper liefert eine Rückmeldung, wenn es
# Nachrichten löscht. Ausgabe durchlassen.
#
if ( system($POSTSUPER, "-d", $qid) != 0 ) {
# Bei Problem mit postsuper abbrechen.
die "Ausführungsfehler bei $POSTSUPER: Fehler" .
"code " . ($?/256) . "n";
}
}
}
close(QUEUE);if (! $qid ) {
die "Keine Nachrichten mit der Adresse <$email_addr> " .
"in der Queue gefunden.n";
}
exit 0;
Teilen.

Über den Autor

Seit der Ausbildung zum Fachinformatiker Systemintegration (2002-2005) bei der DaimlerChrysler AG, beruflich im Bereich der E-Mail Kommunikation (Exchange, Linux) sowie des ActiveDirectory, mit entsprechenden Zertifizierungen (MCSE 2003, MCITP Ent.-Admin 2008, MCSE 2012, LPIC 1-3) tätig. Abgeschlossenes Studium zum Master of Science der IT-Management an der FOM sowie zertifizierter Datenschutzbeauftragter. Aktuell im Projektmanagement tätig.

Antworten