Postfix: Absender in Nachrichten in der Warteschlange ändern

8

Nach einer vollständigen Neuinstallation ist ein Problem mit der Konfiguration aufgetreten: Die Absenderadresse war falsch und einige Empfänger (Mailserver) haben sie abgelehnt.

In der Postfix-Warteschlange stecken also eine Reihe von Mails.

Im Idealfall wäre eine Änderung der Absenderadresse direkt in den E-Mails in der Warteschlange und das anschließende Leeren der Warteschlange optimal.

Ich habe diese Antwort ausprobiert , die genau dieses Problem anspricht. Aber Nachrichten scheinen in meiner Version (2.11.0) nicht leicht zu ändern zu sein.

Zum Beispiel gibt es kein /var/spool/mqueueVerzeichnis, sondern stattdessen/var/spool/postfix/...

active
bounce
corrupt
defer
deferred
dev
etc
flush
hold
incoming
lib
maildrop
pid
private
public
saved
trace
usr

und das dir von Interesse ist deferred. Ich habe versucht, einige Dateien dort zu ändern und die falsche Domain durch die richtige zu ersetzen (und habe darauf geachtet, dass nur diese geändert wurden).

Aber dann wurden diese Mails verschoben corrupt, was bedeutet, dass eine einfache Textänderung nicht zu funktionieren scheint (erledigt mit vi).

Gibt es eine andere sauberere Möglichkeit, den Absender in E-Mails in der Warteschlange zu ändern?

Ring Ø
quelle

Antworten:

19

Ich habe diese Antwort ausprobiert, die genau dieses Problem angeht . Aber Nachrichten scheinen in meiner Version (2.11.0) nicht leicht zu ändern zu sein.

Zum Beispiel gibt es kein / var / spool / mqueue-Verzeichnis, sondern / var / spool / postfix / ...

Ich möchte zwei Dinge klarstellen.

  • Zunächst wurde diese Antwort auf sendmail NOT postfix angewendet.
  • Zweitens wurde das direkte Manipulieren von Raw-Queue-Dateien überhaupt nicht unterstützt.

Sie haben hier also mehrere Möglichkeiten

1. Parameter smtp_generic_maps

Diese Antwort wurde von dieser hervorragenden Antwort inspiriert . Die alte Adresse wird automatisch in eine neue Adresse umgeschrieben. Sie können eine Datei definieren, um die alte Adresse der neuen Adresse zuzuordnen.

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    [email protected]       [email protected]

Vergiss nicht zu postmap /etc/postfix/genericrennenpostfix reload

  • Oberseite: Sie müssen die Nachricht nicht anfordern
  • Nachteil: Postfix schreibt die übereinstimmende Absender- und Empfängeradresse neu[email protected] .

2. sender_canonical_address

Um den Nachteil der ersten Option zu überwinden, können Sie verwenden sender_canonical_maps. Diese Lösung basiert auf dem Vorschlag eines Postfix-Autors . Wie bei der ersten Option können Sie eine Datei definieren, um die alte Adresse der neuen Adresse zuzuordnen.

/etc/postfix/main.cf:
    sender_canonical_maps = hash:/etc/postfix/sender_canonical

/etc/postfix/sender_canonical:
    [email protected]       [email protected]

Laufen, postmap /etc/postfix/sender_canonicaldann laufen postfix reload. Aufgrund des Flusses der Postfix-Warteschlange müssen Sie die betroffene Warteschlange mit dem Befehl erneut in die Warteschlange stellenpostsuper -r queueid

  • Oberseite: Postfix schreibt Empfängeradresse nicht neu.
  • Nachteil: Sie müssen alle betroffenen Nachrichten anfordern. Sie können jedoch alle mit einem einzigen Befehl zurückgestellten Daten anfordernpostsuper -r ALL deferred

3. direkte Manipulation der Postfix-Warteschlange

Dies sind manuelle alte Methoden zum Ändern der Warteschlange für die erweiterte Verarbeitung. Diese Antwort kam von Postfix-Benutzer-Mailinglisten

Zusamenfassend

  • Warteschlange extrahieren

    # postsuper -h queueid
    # postcat -qbh queueid > tempfile.eml
    # vi tempfile.eml
    
  • Warteschlange erneut senden und alte Warteschlange löschen

    # sendmail -f $sender $recipient < tempfile.eml
    # postsuper -d queueid
    

Eine Dokumentation des obigen Befehls finden Sie auf dieser Seite

Hinweis:
Ursprüngliche Lösung aus Postfix-Benutzer-Mailinglisten , postcat -q queueid >tempfilezum Extrahieren der Warteschlange. Dieser Befehl extrahiert den Header, den Body und die Metainformationen der Warteschlange. Wie unten von Azendale erwähnt , sendmailwird das Senden dieser fehlerhaften E-Mail aufgrund von Metainformationen abgelehnt.

Wenn Sie -bhzusätzlich zu den qParametern einen Parameter verwenden, filtert der Postcat-Filter nur die Ausgabe nach Header und Body, ohne Metainformationen. Ein Nebeneffekt davon ist, dass die temporäre Datei das Format hat, das die meisten E-Mail-Clients als EML-Format erkennen, sodass Sie die resultierende (bearbeitete) Nachricht anzeigen können.

masegaloeh
quelle
1
Ich habe es versucht, und zumindest mit meiner Version von Postfix schien es die Nachricht nicht zu senden, bis ich so etwas verwendet habe postcat -qbh queueid >tempfile. (Nebeneffekt: Es ist dann im EML-Format.) Wenn ich es nur benutzte -q, schien es nichts zu tun, als ich sendmail ausführte. Postfix Version 2.8.4. Kann jemand das bestätigen? Wenn ja, bearbeiten wir diese Antwort.
Azendale
Hallo @Azendale, ich teste die dritte Lösung erneut und ja, wir müssen sie verwenden qbh, damit sie funktioniert. Hinzufügen der Erklärung in der aktualisierten Antwort ... :)
masegaloeh
Vielen Dank ! War auf der Suche nach einer dritten Lösung wie. es ist einfach perfekt!
JazZ
1

Schreiben erstellen. Ich hatte ein Problem mit einem Mailserver, der einige Tage mit einer schlechten Konfiguration ausgeführt wurde, und daher gab es viele Warteschlangen, die mit einem neuen Empfänger erneut gesendet werden mussten. Also habe ich zwei Einzeiler erstellt, um alle Warteschlangen zu durchlaufen:

Erster, der alle Warteschlangen findet, in die Warteschleife stellt, als EML-Dateien speichert und erneut sendet:

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -h $ID; postcat -qbh $ID > tempfile$ID.eml; sendmail -f $sender $recipient < tempfile$ID.eml; done

Zweitens zum Löschen der Warteschlangen:

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -d $ID; done

Denken Sie daran, zu überprüfen, ob keine neuen Warteschlangen vorhanden sind, die nicht gehalten werden, bevor Sie diesen letzten Code ausführen. Geben Sie dazu Folgendes aus und suchen Sie nach Warteschlangen-IDs ohne '!' Am Ende:

mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }'

On konnte diese beiden Einzeiler leicht in einen einfügen, aber ich hatte das Gefühl, mehr Kontrolle zu haben, indem ich überprüfte, ob die E-Mails tatsächlich eingegangen waren, bevor ich die Warteschlangen löschte.

Jorn
quelle