Comment débuter un serveur SMTP
La mise en place d’un faux serveur SMTP n’est pas forcément une tâche de tout repos, à Leikir Web il nous a fallu pas mal de temps et de recherche pour le faire. Dans cet article, nous vous invitons à suivre les étapes traversées lors de la conception et mise en place de ce serveur.
Mettre en place un client mail
Avant toute chose, si l’on souhaite faire un faux serveur SMTP, il faut qu’on puisse… Envoyer un email ! En effet, si l’on veut que notre serveur soit capable de manipuler des emails, il faut pouvoir en créer et lui envoyer.
On commence donc par mettre en place un script ruby ayant pour but d’envoyer un email. Ici, pas besoin de rails, la lib SMTP de ruby fait l’affaire. Ensuite, pour vérifier que le script fonctionne, on le teste avec un serveur SMTP existant (celui de Gmail dans notre cas).
Maintenant qu’on a notre client mail, on va pouvoir commencer à penser à notre faux serveur SMTP, mais au fait c’est quoi le SMTP ?
Comprendre le fonctionnement du protocole SMTP
Si l’on devait résumer en une phrase le SMTP (Simple Mail Transfert Protocol) on dirait que c’est le protocole qui permet le transfert d’email.
Pour que notre client transmette notre email au serveur SMTP, il faut que celui-ci accepte de le recevoir. Un échange de message va être effectué entre le client et le serveur SMTP, permettant d’authentifier le client, puis de récupérer les informations nécessaires au transfert du mail et lui transmettre.
Un exemple de cet échange est représenté sur l’image suivante :
- Étape 1 : La communication entre le serveur et le client commence par le message HELO permettant au client de s’identifier.
- Étape 2 : Ensuite le client va transmettre au serveur SMTP les informations sur l’envoi et les destinataires dans un message MAILTO. Si le serveur a bien validé les informations précédentes, il va pouvoir recevoir le contenu de l’email au travers du message DATA.
- Si vous souhaitez comprendre plus en détail le fonctionnement du protocole SMTP, je vous invite à lire cet article.
- Étape 3 : le serveur envoie le mail vers le client mail des destinataires contenu dans le MAILTO. Le contenu pourra être visualisé grâce aux protocoles IMAP ou POP3.
Mais dans notre cas, c’est un faux serveur SMTP que l’on veut, nous aurons donc besoin de le connecter à une base de données pour enregistrer les mails au lieu de les envoyer.
S’entraîner sur un projet existant
Une fois que la théorie est comprise il faut passer à la pratique, mais pas de précipitation. Nous ne sommes probablement pas les premiers développeurs à travailler sur un serveur SMTP, il serait dommage de ne pas profiter de leurs expériences.
Nous nous mettons donc à la recherche des différents projets accessibles autour d’’un faux serveur SMTP en ruby.
Pour ma part, j’ai utilisé l’excellent repository MIDI-SMTP https://github.com/4commerce-technologies-AG/midi-smtp-server de Tom Freudenber (https://about.me/tom.freudenberg), qui correspond à ce que je cherchais.
Il s’agit d’une librairie personnalisable autour des fonctionnalités du SMTP.
On le branche donc au client mail que l’on vient de créer et on commence à décortiquer le fonctionnement. On y retrouve tout un tas d’informations intéressantes : l’utilisation de Net::STMP, la communication avec le client, l’authentification, le chiffrage avec SSL, etc.
Une fois qu’on a démystifié le fonctionnement d’un serveur SMTP, on peut mettre le nôtre en place.
Mettre en place la communication Server / Client
Pour que notre client puisse se connecter avec notre serveur, on spécifie un port accepté par ce dernier pour la communication entre eux. Ensuite il va falloir parser (analyser, parcourir) le contenu des messages qui vont être envoyés.
L’idéal serait de mettre un gros parser en place, mais pour le début on se contente de faire une version assez simple.
Pour ce qui est du parsing du contenu de l’email, pas besoin de réinventer la roue, on se dirige vers la Gem mail : https://github.com/mikel/mail.
Il s’agit ‘simplement’ d’une libraire chargée de parser le contenu d’un email, et elle le fait très bien.
Super ! On a maintenant la possibilité de recevoir un email sur notre faux serveur SMTP, puis de l’envoyer ou de l’enregistrer dans notre base de données.
Mais il nous manque encore une chose, la sécurité. En effet, si l’on veut que les emails qui passent par notre serveur ne soient pas visibles en clair par un petit malin connecté au réseaux, il va falloir les chiffrer.
Mise en place du TLS
Le protocole TLS (Transport Layout Security), est un protocole de sécurité lors d’échanges informatiques. C’est une évolution du SSL (Secure Sockets Layer), qui va nous apporter le cryptage des données dont on a besoin. Je ne vais pas rentrer ici dans le détail du fonctionnement du chiffrage d’un email mais vous pouvez lire notre article à ce propos ici.
Pour faire simple, l’émetteur et le récepteur du message vont se mettre d’accord sur une clé de chiffrement, avec laquelle on va encoder les données du mail.
Ainsi, seuls les possesseurs de la clé pourront décoder les données et accéder au contenu de l’email.
Aller plus loin
Merveilleux ! Notre faux serveur SMTP est en place et fonctionne ! Mais on l’a seulement connecté à un client mail en ruby, il faut maintenant tester ça avec différentes technos.
Dernière étape donc, mettons en place plusieurs clients dans différents langages et frameworks. Très vite, on se rend compte des limites de notre parser, qui ne tient malheureusement pas compte des petites différences d’implémentation d’un langage à l’autre. Il faut donc améliorer notre serveur SMTP pour le rendre compatible avec un maximum d’applications. Maintenir une compatibilité maximale tout en adaptant et ajoutant de nouvelles technos sera un travail à effectuer tout au long de la vie de votre serveur SMTP.
Voilà, c’était mon cheminement pour mettre en place un début de faux serveur SMTP fonctionnel. Certes il reste encore du travail pour améliorer les performances, mais cette première version est complète : objectif atteint !
À vous de jouer maintenant ! Autrement, vous pouvez vous éviter le mal de tête et utiliser notre outil Pacomail, applicable sur tout un tas de langages et avec pleins d’autres fonctionnalités pour éditer proprement un mail.
Vous avez 15 jours gratuits ou une version d’essai gratuite avec des limitations.
A très vite les SMTP-bricoleurs !
Sources:
https://github.com/4commerce-technologies-AG/midi-smtp-server
https://github.com/mikel/mail