SMTP-sink, tester l'envoi de mail

Posted on lun. 11 mars 2019 in adminsys

La demande : fake-smtp pour l'envoi de mail pour tests

A mon boulot actuel, j'ai eu une demande intéressante : les développeurs désiraient avoir un serveur SMTP pour tester l'envoi de mail, y compris avec des data de prod (et donc les vraies adresses e-mail des clients), mais sans que les e-mails soient reçus par les clients.

Le plus simple était de démarrer un serveur postfix en interne et de tout envoyer dans /dev/null.

Mais les dev voulaient aussi pouvoir accéder aux e-mails envoyés pour pouvoir vérifier le formatage, le MIME, etc... Tout envoyer dans /dev/null ne peut pas convenir. J'ai donc mis en place un combo smtp-sink + partage samba sur un petit serveur linux.

La solution : smtp-sink

SMTP-sink est un soft de la suite postfix. Ca s'installe avec le package postfix (apt-get ou yum, à votre convenance), tout simplement.

Il a ça d'interessant qu'il est un serveur SMTP normal, qui accepte tout mail entrant, et le met dans un fichier sur disque. C'est tout ce qu'il fait. Il ne fera rien d'autre des e-mail que de les mettre dans un fichier. Il ne les enverra pas ailleurs. C'est parfait pour du debug !

ATTENTION : à ne pas faire sur un serveur qui écoute sur internet. Uniquement en interne et pour tests.

Ca s'utilise comme ça (en root pour pouvoir écouter sur le port 25) :

[root@outils-fakesmtp ~]# smtp-sink :25 100

Dans mon cas, voici l'exacte ligne de commande utilisée. Bon, OK, j'aurais du en faire un service (pas inclu dans le package postfix), je note ça dans ma TODO liste.

[root@outils-fakesmtp ~]# screen -dmSL smtp-sink smtp-sink -u mail -d '%Y%m%d-%Hh%M.' -R /var/mail/ -c :25 100

Expliquons :

  • screen : pour le lancer dans un screen, comme ça on peut le détacher et ça continuera à fonctionner. C'est d'ailleur ce qui est fait avec les options suivantes.
  • -dmSL smtp-sink : on crée puis détache le screen, avec du logging et comme nom de session "smtp-sink"
  • smtp-sink : la commande en elle-même
  • -u mail : le user avec lequel smtp-sink doit tourner, on ne va pas le laisser tourner en root
  • -d %Y%m%d-%Hh%M. : comment on nomme les fichiers (${année}${mois}${jour}-${heure}h${minute}.hash dans ce cas-ci). A noter qu'un hash est toujours ajouté en fin de fichier
  • -R /var/mail : où stocker les fichiers

C'est chouette, on peut voir les e-mails dans /var/mail :

[root@outils-fakesmtp ~]# ls /var/mail/
20190310-08h15.0ad30c02  20190311-08h46.2dfc539b

Il n'y a plus qu'à partager ce répertoire avec samba.

L'astuce en plus

Les dev peuvent parfois être et pointilleux et ignares (nul n'est parfait, et surtout pas moi 😜 ), et donc, quand ils ouvrent leur navigateur de fichier dans \\outils-fakesmtp\mail\, ils ne voient pas des "e-mails" qu'ils peuvent ouvrir en double-cliquant, uniquement des fichiers "bizarres".

Le plus simple est de renommer les fichiers pour leur ajouter une extension .eml, et comme on est DevOps, autant l'automatiser avec cette commande en tâche cron qui tournera toutes les minutes :

for f in `ls /var/mail/* | grep -v '.eml'`; do mv $f /var/mail/`basename $f `.eml; done; find /var/mail/ -type f -name '*.eml' -mtime +1 -exec rm {} \\;

(Pour ceux qui liront cette ligne de commande, vous noterez que la dernière commande est une commande de nettoyage pour éviter d'avoir un répertoire qui se rempli ad vitam æternam)

Je conviens que ce n'est pas optimal, mais je ne vais pas tout faire pour vous. 😉