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;