Come configuro Postfix per archiviare la posta elettronica in un file invece di inoltrarlo?


9

Voglio eseguire una copia temporanea di un server di produzione su un ambiente locale. Il sistema esegue un'applicazione PHP, che invia e-mail ai clienti in vari scenari e voglio assicurarmi che nessuna e-mail venga mai inviata dall'ambiente di gestione temporanea.

Posso modificare il codice in modo che utilizzi un mittente e-mail fittizio, ma vorrei eseguire lo stesso codice dell'ambiente di produzione. Posso usare un MTA diverso (Postfix è proprio quello che usiamo in produzione), ma mi piacerebbe qualcosa che sia facile da configurare sotto Debian / Ubuntu :)

Quindi, vorrei impostare l'installazione Postfix locale per archiviare tutta la posta elettronica in (uno o più) file invece di inoltrarla. In realtà, non mi interessa davvero come viene archiviato, purché sia ​​possibile controllare l'e-mail che è stata inviata. Anche un'opzione di impostazione che dice a postfix di mantenere l'e-mail nella coda di posta funzionerebbe (posso eliminare la coda quando ricarico il server di gestione temporanea con una copia dalla produzione).

So che è possibile, non ho trovato nessuna buona soluzione online per quella che sembra un'esigenza abbastanza comune.

Grazie!

Risposte:


12

Ho creato un nuovo trasporto con un comando pipe che scrive la posta elettronica in un file.

Fondamentalmente:

  1. Crea un utente che possiederà la posta elettronica (o userà uno esistente). Ho chiamato il mioemail
  2. mkdir /home/email/bin
  3. Inserisci il seguente script in /home/email/bin/mail_eater(questo utilizza PHP, ma puoi scrivere la tua versione in qualsiasi lingua che ti piace, aggiunge semplicemente stdin a un file):

    #!/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. Crea un nuovo trasporto utilizzando questo file aggiungendo la seguente riga in master.cf:

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
  8. Utilizzare questo come trasporto predefinito in main.cf:

    default_transport = file_route
    

Là :)


3

Si potrebbe mettere quei domini in $mydestinationin main.cf, in modo da postfix lo consegnerà a livello locale.

Se lo si desidera, è possibile impostare diversi utenti locali oppure impostare un indirizzo catch-all locale per recapitare le e-mail in un solo account, maggiori dettagli qui: http://www.postfix.org/ADDRESS_REWRITING_README.html#luser_relay

Per tutti i domini:

mydestination = pcre:/etc/postfix/mydestinations

e /etc/postfix/mydestinationsdovrebbe contenere

/.*/    ACCEPT

Non posso testare adesso ma dovrebbe funzionare.


Non so che aspetto abbiano i domini di destinazione (provengono da un vero database di clienti). Controllerò il link però.
GomoX,

Grazie per l'aggiornamento, ho pubblicato la mia soluzione al problema perché sembra "più pulita", ma la tua sembra funzionare anche.
GomoX,

Per funzionare come previsto, ciò richiede anche l'impostazione local_recipient_maps = . È descritto nel link che hai fornito, ma penso che dovrebbe essere menzionato anche nella risposta.
jojman,

2

provare (in main.cf):

defer_transports = smtp

puoi quindi vedere la coda postqueue -pe guardare i contenuti conpostcat


0

A seconda della tua distribuzione, puoi guardare "nullmailer". Questo è un MTA di inoltro, che inoltra a un altro SMTP sulla rete o sul telecomando. Questo potrebbe benissimo essere un SMTP non valido, e in quel caso probabilmente lo metterebbe solo in una coda su una cartella della macchina.

Su debian e ubuntu questo è disponibile come MTA sostitutivo per il tuo sistema.


0

Questo è copiato e leggermente modificato dal mio blog http://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html :

Non è nemmeno necessario configurare Postfix per agire come nullmailer. Postfix viene fornito con uno strumento pulito chiamato smtp-sinkche fa il trucco. smtp-sink è principalmente destinato a fungere da strumento di test per i client SMTP che hanno bisogno di un server con cui giocare. Quindi puoi configurarlo per registrare l'intera conversazione o persino scaricare ogni mail ricevuta in un file. Quest'ultimo è necessario per un nullmailer.

Non esiste un file di configurazione per configurare smtp-sink. Tutto viene eseguito tramite le opzioni della riga di comando.

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

Diamo un'occhiata più da vicino a ciascun parametro.

-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.

Puoi trovare maggiori informazioni nella pagina man di smtp-sink, ma questi sono quelli importanti per eseguire uno spamtrap generico. In questa configurazione il programma accetta qualsiasi posta di qualsiasi dimensione da qualsiasi mittente a qualsiasi destinatario con IPv4 e IPv6. Le uniche restrizioni sono che sono possibili solo 256 connessioni simultanee con 1024 connessioni in coda e il programma è contrassegnato come sperimentale. Quindi non utilizzare smtp-sink in un ambiente di produzione.

L'opzione -B è valida solo nelle versioni più recenti di Postfix. In 2.7.1 manca. In 2.8.2 è presente. Fu introdotto da qualche parte nel mezzo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.