Comment configurer postfix pour stocker les e-mails dans un fichier au lieu de les relayer?


9

Je souhaite exécuter une copie intermédiaire d'un serveur de production sur un environnement local. Le système exécute une application PHP, qui envoie des e-mails aux clients dans divers scénarios et je veux m'assurer qu'aucun e-mail n'est jamais envoyé depuis l'environnement de transfert.

Je peux modifier le code afin qu'il utilise un expéditeur de courrier électronique factice, mais je voudrais exécuter le même code exact que l'environnement de production. Je peux utiliser un MTA différent (Postfix est exactement ce que nous utilisons en production), mais j'aimerais quelque chose de facile à configurer sous Debian / Ubuntu :)

Je voudrais donc configurer l'installation locale de Postfix pour stocker tous les e-mails dans (un ou plusieurs) fichiers au lieu de les relayer. En fait, je ne me soucie pas vraiment de la façon dont il est stocké tant qu'il est possible de vérifier l'e-mail qui a été envoyé. Même une option de configuration qui indique à postfix de conserver le courrier électronique dans la file d'attente de courrier électronique fonctionnerait (je peux purger la file d'attente lorsque je recharge le serveur intermédiaire avec une copie de la production).

Je sais que c'est possible, je n'ai tout simplement pas trouvé de bonne solution en ligne pour ce qui semble être un besoin assez courant.

Merci!

Réponses:


12

J'ai créé un nouveau transport avec une commande de canal qui écrit des e-mails dans un fichier.

Fondamentalement:

  1. Créez un utilisateur qui possédera le courrier électronique (ou utilisez un existant). J'ai appelé le mienemail
  2. mkdir /home/email/bin
  3. Placez le script suivant /home/email/bin/mail_eater(cela utilise PHP, mais vous pouvez écrire votre propre version dans n'importe quelle langue que vous aimez, il ajoute simplement stdin à un fichier):

    #!/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. Créez un nouveau transport à l'aide de ce fichier en ajoutant la ligne suivante master.cf:

    file_route unix -    n    n    -    -    pipe user=email  argv=/home/email/bin/mail_eater
    
  8. Utilisez-le comme transport par défaut dans main.cf:

    default_transport = file_route
    

Là :)


3

Vous pouvez mettre ces domaines dans $mydestinationin main.cf, donc postfix le livrera localement.

Vous pouvez configurer différents utilisateurs locaux si vous le souhaitez ou vous pouvez configurer une adresse fourre-tout locale pour envoyer des e-mails dans un seul compte, plus de détails ici: http://www.postfix.org/ADDRESS_REWRITING_README.html#luser_relay

Pour tous les domaines:

mydestination = pcre:/etc/postfix/mydestinations

et /etc/postfix/mydestinationsdoit contenir

/.*/    ACCEPT

Je ne peux pas tester pour le moment mais cela devrait fonctionner.


Je ne sais pas à quoi ressemblent les domaines de destination (ils proviennent d'une vraie base de données clients). Je vérifierai cependant le lien.
GomoX

Merci pour la mise à jour, j'ai posté ma propre solution au problème car elle semble "plus propre" mais la vôtre semble fonctionner également.
GomoX

Pour fonctionner comme prévu, cela nécessite également une configuration local_recipient_maps = . Il est décrit dans le lien que vous avez fourni, mais je pense qu'il devrait également être mentionné dans la réponse.
jojman

2

essayez (dans main.cf):

defer_transports = smtp

vous pouvez ensuite voir la file d'attente postqueue -pet regarder le contenu avecpostcat


0

Selon votre distribution, vous pouvez regarder "nullmailer". Il s'agit d'un MTA relais, qui relaie vers un autre SMTP sur votre réseau ou à distance. Cela pourrait très bien être un SMTP invalide, et dans ce cas, il ne le mettrait probablement que dans une file d'attente sur un dossier sur la machine.

Sur debian et ubuntu, ceci est disponible en tant que MTA de remplacement pour votre système.


0

Ceci est copié et légèrement modifié depuis mon blog http://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html :

Vous n'avez même pas besoin de configurer Postfix pour agir comme un nullmailer. Postfix est livré avec un outil soigné appelé smtp-sinkqui fait l'affaire. smtp-sink est principalement destiné à servir d'outil de test pour les clients SMTP qui ont besoin d'un serveur pour jouer avec. Vous pouvez donc le configurer pour enregistrer toute la conversation ou même vider chaque courrier reçu dans un fichier. Ce dernier est nécessaire pour un nullmailer.

Il n'y a pas de fichier de configuration pour configurer smtp-sink. Tout se fait via les options de ligne de commande.

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

Examinons de plus près chaque paramètre.

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

Vous pouvez trouver plus d'informations dans la page de manuel de smtp-sink, mais ce sont les plus importantes pour exécuter un spamtrap fourre-tout. Dans cette configuration, le programme accepte tout courrier de n'importe quelle taille, de n'importe quel expéditeur à n'importe quel destinataire avec IPv4 et IPv6. Les seules restrictions sont qu'il n'y a que 256 connexions simultanées possibles avec 1024 connexions en file d'attente et le programme est marqué expérimental. N'utilisez donc pas smtp-sink dans un environnement de production.

L'option -B n'est valide que dans les versions plus récentes de Postfix. En 2.7.1, il manque. En 2.8.2, il est présent. Quelque part entre les deux, il a été introduit.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.