Wie richte ich Postfix ein, um E-Mails in einer Datei zu speichern, anstatt sie weiterzuleiten?


9

Ich möchte eine Staging-Kopie eines Produktionsservers in einer lokalen Umgebung ausführen. Das System führt eine PHP-Anwendung aus, die in verschiedenen Szenarien E-Mails an Kunden sendet. Ich möchte sicherstellen, dass niemals E-Mails aus der Staging-Umgebung gesendet werden.

Ich kann den Code so anpassen, dass er einen Dummy-E-Mail-Absender verwendet, aber ich möchte genau den gleichen Code wie die Produktionsumgebung ausführen. Ich kann einen anderen MTA verwenden (Postfix ist genau das, was wir in der Produktion verwenden), aber ich möchte etwas, das unter Debian / Ubuntu einfach einzurichten ist :)

Daher möchte ich die lokale Postfix-Installation so einrichten, dass alle E-Mails in (einer oder mehreren) Dateien gespeichert werden, anstatt sie weiterzuleiten. Eigentlich ist es mir egal, wie es gespeichert wird, solange es möglich ist, die gesendete E-Mail zu überprüfen. Sogar eine Einrichtungsoption, die postfix anweist, die E-Mail in der E-Mail-Warteschlange zu belassen, würde funktionieren (ich kann die Warteschlange löschen, wenn ich den Staging-Server mit einer Kopie aus der Produktion neu lade).

Ich weiß, dass dies möglich ist. Ich habe online einfach keine gute Lösung für ein scheinbar recht häufiges Bedürfnis gefunden.

Vielen Dank!

Antworten:


12

Ich habe einen neuen Transport mit einem Pipe-Befehl erstellt, der E-Mails in eine Datei schreibt.

Grundsätzlich:

  1. Erstellen Sie einen Benutzer, der eine E-Mail besitzt (oder eine vorhandene verwendet). Ich habe meine angerufenemail
  2. mkdir /home/email/bin
  3. Platzieren Sie das folgende Skript in /home/email/bin/mail_eater(dies verwendet PHP, aber Sie können Ihre eigene Version in einer beliebigen Sprache schreiben, es wird nur stdin an eine Datei angehängt):

    #!/usr/bin/php
    <?php
    $fd = fopen("php://stdin", "r");
    $email = "";
    while (!feof($fd)) {
        $email .= fread($fd, 1024);
    }
    fclose($fd);
    $fh = fopen('/home/email/email.txt','a');
    fwrite($fh, $email."\n-------------------------------------------------------\n\n");
    fclose($fh);
    
  4. chmod a+x /home/email/bin/mail_eater
  5. touch /home/email/email.txt
  6. chmod a+r /home/email/email.txt
  7. Erstellen Sie mit dieser Datei einen neuen Transport, indem Sie die folgende Zeile anhängen master.cf:

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
  8. Verwenden Sie dies als Standardtransport in main.cf:

    default_transport = file_route
    

Dort :)


3

Sie könnten diese Domänen in setzen $mydestinationin main.cf, so postfix es lokal liefern.

Sie können verschiedene lokale Benutzer einrichten, wenn Sie möchten, oder Sie können eine lokale Sammeladresse einrichten, um E-Mails an nur ein Konto zu senden. Weitere Informationen finden Sie hier: http://www.postfix.org/ADDRESS_REWRITING_README.html#luser_relay

Für alle Domains:

mydestination = pcre:/etc/postfix/mydestinations

und /etc/postfix/mydestinationssollte enthalten

/.*/    ACCEPT

Ich kann momentan nicht testen, aber es sollte funktionieren.


Ich weiß nicht, wie die Zieldomänen aussehen (sie stammen aus einer echten Kundendatenbank). Ich werde den Link allerdings überprüfen.
GomoX

Vielen Dank für das Update. Ich habe meine eigene Lösung für das Problem veröffentlicht, da es "sauberer" zu sein scheint, aber Ihre sieht so aus, als ob es auch funktionieren sollte.
GomoX

Um wie beabsichtigt zu arbeiten, muss dies ebenfalls eingestellt werden local_recipient_maps = . Es ist in dem von Ihnen angegebenen Link beschrieben, aber ich denke, es sollte auch in der Antwort erwähnt werden.
Jojman

2

versuchen Sie (in main.cf):

defer_transports = smtp

Sie können dann die Warteschlange anzeigen postqueue -pund Inhalte mit ansehenpostcat


0

Abhängig von Ihrer Distribution können Sie sich "nullmailer" ansehen. Dies ist ein Weiterleitungs-MTA, der an ein anderes SMTP in Ihrem Netzwerk oder auf Ihrem Remote weitergeleitet wird. Dies könnte sehr gut ein ungültiges SMTP sein, und in diesem Fall würde es wahrscheinlich nur in eine Warteschlange in einem Ordner auf dem Computer gestellt.

Unter Debian und Ubuntu ist dies als Ersatz-MTA für Ihr System verfügbar.


0

Dies wurde von meinem Blog http://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html kopiert und leicht modifiziert :

Sie müssen Postfix nicht einmal so konfigurieren, dass es als Nullmailer fungiert. Postfix wird mit einem netten Tool ausgeliefert, smtp-sinkdas den Trick erledigt. smtp-sink soll hauptsächlich als Testwerkzeug für SMTP-Clients dienen, die einen Server zum Spielen benötigen. Sie können es also so konfigurieren, dass die gesamte Konversation protokolliert oder sogar jede empfangene E-Mail in eine Datei geschrieben wird. Letzteres wird für einen Nullmailer benötigt.

Es gibt keine Konfigurationsdatei zum Konfigurieren von smtp-sink. Alles erfolgt über Befehlszeilenoptionen.

smtp-sink -c -d "%Y%m%d%H/%M." -f . -u postfix -R /tmp/ -B "550 5.3.0 The recipient does not like your mail. Don't try again." -h spamtrap.example.com 25 1024

Schauen wir uns jeden Parameter genauer an.

-u postfix
Runs the program under the user "postfix"
-R /tmp/
Sets the output directory to /tmp/. In this directory the mails will be stored. If you have a high spam volume (hundreds of Spam per minute) it is recommended to write the mails to a ramdisk
-d "%Y%m%d%H/%M."
Writes the mail to a directory of the format "YearMonthDayHour" and in this directory the files are name "Month.RandomID". Note that the dates are in UTC
-c
Write statistics about connection counts and message counts to stdout while running
-f .
Reject the mail after END-OF-DATA. But the mail will be saved. Cool, isn't it?!
-B "550 5.3.0 The recipient does not like your mail. Don't try again"
This is the rejection message after END-OF-DATA.
-h spamtrap.example.com
Announce the hostname spamtrap.example.com
25
The port to listen on. Can be prepended with an IP or host if you want to bind on a special interface.
1024
The backlog count of connections that can wait in the TCP/IP stack before they get a free slot for sending mail.

Weitere Informationen finden Sie in der Manpage von smtp-sink, aber dies sind die wichtigsten, um eine Sammel-Spamfalle auszuführen. In dieser Konfiguration akzeptiert das Programm alle E-Mails beliebiger Größe von jedem Absender an jeden Empfänger mit IPv4 und IPv6. Die einzigen Einschränkungen bestehen darin, dass mit 1024 Verbindungen in der Warteschlange nur 256 gleichzeitige Verbindungen möglich sind und das Programm als experimentell gekennzeichnet ist. Verwenden Sie smtp-sink daher nicht in einer Produktionsumgebung.

Die Option -B ist nur in neueren Versionen von Postfix gültig. In 2.7.1 fehlt es. In 2.8.2 ist es vorhanden. Irgendwo dazwischen wurde es eingeführt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.