¿Cómo configuro postfix para almacenar el correo electrónico en un archivo en lugar de retransmitirlo?

9

Quiero ejecutar una copia provisional de un servidor de producción en un entorno local. El sistema ejecuta una aplicación PHP, que envía correo electrónico a los clientes en varios escenarios y quiero asegurarme de que nunca se envíe correo electrónico desde el entorno de ensayo.

Puedo modificar el código para que use un remitente de correo electrónico ficticio, pero me gustaría ejecutar exactamente el mismo código que el entorno de producción. Puedo usar un MTA diferente (Postfix es justo lo que usamos en producción), pero me gustaría algo que sea fácil de configurar en Debian / Ubuntu :)

Por lo tanto, me gustaría configurar la instalación local de Postfix para almacenar todo el correo electrónico en (uno o más) archivos en lugar de retransmitirlo. En realidad, no me importa cómo se almacena, siempre que sea posible verificar el correo electrónico enviado. Incluso una opción de configuración que le indica a postfix que mantenga el correo electrónico en la cola de correo funcionaría (puedo purgar la cola cuando vuelvo a cargar el servidor de ensayo con una copia de producción).

Sé que esto es posible, simplemente no he encontrado ninguna buena solución en línea para lo que parece una necesidad bastante común.

¡Gracias!

GomoX
fuente

Respuestas:

12

Creé un nuevo transporte con un comando de canalización que escribe el correo electrónico en un archivo.

Básicamente:

  1. Cree un usuario que sea propietario del correo electrónico (o use uno existente). Llamé al míoemail
  2. mkdir /home/email/bin
  3. Coloque el siguiente script /home/email/bin/mail_eater(esto usa PHP, pero puede escribir su propia versión en el idioma que desee, simplemente agrega stdin a un archivo):

    #!/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. Cree un nuevo transporte utilizando este archivo agregando la siguiente línea en master.cf:

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
  8. Use esto como el transporte predeterminado en main.cf:

    default_transport = file_route
    

Allí :)

GomoX
fuente
3

Puede poner esos dominios $mydestinationen main.cf, por lo que postfix lo entregará localmente.

Puede configurar diferentes usuarios locales si lo desea o puede configurar una dirección local general para enviar correos electrónicos en una sola cuenta, más detalles aquí: http://www.postfix.org/ADDRESS_REWRITING_README.html#luser_relay

Para todos los dominios:

mydestination = pcre:/etc/postfix/mydestinations

y /etc/postfix/mydestinationsdebe contener

/.*/    ACCEPT

No puedo probar en este momento, pero debería funcionar.

Laurentiu Roescu
fuente
No sé cómo se ven los dominios de destino (provienen de una base de datos de clientes real). Aunque comprobaré el enlace.
GomoX
Gracias por la actualización, publiqué mi propia solución al problema, ya que parece "más limpia", pero parece que la suya debería funcionar también.
GomoX
Para que funcione según lo previsto, esto también requiere configuración local_recipient_maps = . Se describe en el enlace que proporcionó, pero creo que también debería mencionarse en la respuesta.
jojman
2

intente (en main.cf):

defer_transports = smtp

luego puede ver la cola postqueue -py ver contenido conpostcat

Arek B.
fuente
0

Dependiendo de su distribución, puede mirar "nullmailer". Este es un MTA de retransmisión, que se transmite a otro SMTP en su red o control remoto. Esto podría muy bien ser un SMTP no válido, y en ese caso probablemente solo lo pondría en una cola en una carpeta en la máquina.

En debian y ubuntu, esto está disponible como un MTA de reemplazo para su sistema.

jishi
fuente
0

Esto se copia y se modifica ligeramente desde mi blog http://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html :

Ni siquiera tiene que configurar Postfix para actuar como un nullmailer. Postfix se envía con una herramienta ordenada llamada smtp-sinkque hace el truco. smtp-sink está destinado principalmente a actuar como una herramienta de prueba para clientes SMTP que necesitan un servidor para jugar. Por lo tanto, puede configurarlo para registrar toda la conversación o incluso volcar cada correo recibido en un archivo. Este último es necesario para un nullmailer.

No hay archivo de configuración para configurar smtp-sink. Todo se hace a través de las opciones de línea de comandos.

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

Echemos un vistazo más de cerca a cada parámetro.

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

Puede encontrar más información en la página de manual de smtp-sink, pero estos son los más importantes para ejecutar una trampa de spam general. En esta configuración, el programa acepta cualquier correo con cualquier tamaño desde cualquier remitente a cualquier destinatario con IPv4 e IPv6. Las únicas restricciones son que solo hay 256 conexiones simultáneas posibles con 1024 conexiones en cola y el programa se marca experimental. Por lo tanto, no use smtp-sink en un entorno de producción.

La opción -B solo es válida en las versiones más recientes de Postfix. En 2.7.1 falta. En 2.8.2 está presente. En algún punto intermedio se introdujo.

mailq
fuente