| diagrammes | ||
| protocol | ||
| server | ||
| storage | ||
| user_database | ||
| .gitignore | ||
| main.py | ||
| README.md | ||
| test.py | ||
Serveur SMTP Version 2 - Projet Interopérabilité M1 SSIR
🎬 Vidéo de présentation
➡️ Version 1
➡️ Version 2
Auteurs
- David Nahon
- Aurélien Starz
- Bastien Moreau
Description
Ce projet consiste en l'implémentation d'un serveur SMTP simplifié en Python. Le serveur respecte les bases du protocole SMTP (RFC 5321) et permet de recevoir des emails via des commandes standard.
L'objectif était de comprendre le fonctionnement interne d'un serveur de messagerie et de mettre en pratique les notions d'interopérabilité vues en cours.
Fonctionnalités
- Acceptation de connexions TCP multiples (multithreading)
- Commandes SMTP supportées :
HELO domain.com: définit le nom de l’hôte du serveur clientEHLO domain.com: renvoie une erreur car non-implémentéMAIL FROM:<adresse>: définit l'expéditeurRCPT TO:<adresse>: définit le(s) destinataire(s)DATA: permet l'envoi du corps du messageQUIT: ferme la connexionRSET: réinitialise la transaction en cours
- Stockage des emails reçus dans des fichiers texte (un fichier par destinataire)
- Gestion d'état conforme au protocole SMTP (machine à états)
- Arrêt propre du serveur via Ctrl+C
Architecture du projet
├── main.py # Point d'entrée du serveur
├── test.py # Script de test
├── mailbox/ # Répertoire de stockage des emails
├── server/
│ ├── smtp_server.py # Serveur TCP principal
│ └── client_handler.py # Gestion des connexions clients
├── protocol/
│ └── smtp_protocol_engine.py # Machine à états SMTP
├── storage/
│ ├── i_mail_storage.py # Interface de stockage
│ └── file_based_storage.py # Implémentation fichier
└── diagrammes/ # Diagrammes UML (PlantUML, Mermaid)
Prérequis
- Python 3.8 ou supérieur
- Aucune dépendance externe (bibliothèque standard uniquement)
Installation et lancement
-
Cloner le projet ou extraire l'archive
-
Lancer le serveur :
python main.py
Le serveur démarre par défaut sur le port 2525 (port non privilégié pour éviter les droits root).
- Pour tester l'envoi d'un email :
python test.py
Utilisation manuelle avec telnet/netcat
Vous pouvez aussi tester manuellement avec telnet :
telnet localhost 2525
Puis entrer les commandes SMTP :
EHLO domain.com
HELO domain.com
MAIL FROM:<moi@test.fr>
RCPT TO:<dest@example.com>
DATA
Subject: Mon sujet
Contenu du mail.
.
QUIT
Stockage des emails
Les emails reçus sont stockés dans le dossier ./mailbox/. Chaque destinataire a son propre fichier (destinataire@example.com.txt). Si plusieurs emails sont envoyés au même destinataire, ils sont ajoutés à la suite dans le fichier, séparés par une ligne de =.
Choix techniques
- Multithreading : chaque client est géré dans un thread séparé pour permettre les connexions simultanées
- Machine à états : le protocole SMTP est implémenté via une machine à états (classe
SMTPProtocolEngine) pour garantir le respect de l'ordre des commandes - Interface de stockage : on a utilisé une interface (
IMailStorage) pour découpler le stockage du reste du code, ce qui permet de changer facilement l'implémentation (fichiers, base de données, etc.) - Port 2525 : choisi pour ne pas avoir besoin des droits administrateur (le port 25 standard nécessite les droits root)
Diagrammes
Les diagrammes UML sont disponibles dans le dossier diagrammes/ :
- Diagramme de classes
- Diagrammes d'états
- Diagramme de séquence
Limites et améliorations possibles
- Pas d'authentification (SMTP AUTH non implémenté)
- Pas de chiffrement TLS/SSL
- Pas de vérification des adresses email (syntaxe basique uniquement)
- Le serveur ne transfère pas les emails vers d'autres serveurs (pas de relay)
Ces limitations sont volontaires car l'objectif était de comprendre le protocole de base, pas de faire un serveur de production.
Tests
Le fichier test.py contient un script qui envoie un email de test au serveur. Il peut être lancé pendant que le serveur tourne pour vérifier le bon fonctionnement.
Projet réalisé dans le cadre du cours d'Interopérabilité - M1 SSIR - 2025/2026