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;

    Leave A Reply