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.