No description
Find a file
2026-01-23 16:32:40 +01:00
diagrammes Done with updating the UML diagramms 2026-01-09 11:21:25 +01:00
protocol POP auth functionnal 2026-01-23 16:32:40 +01:00
server Forgor QUIT 2026-01-23 00:04:35 +01:00
storage POP auth functionnal 2026-01-23 16:32:40 +01:00
user_database Almost added POP auth 2026-01-23 11:58:24 +01:00
.gitignore Changed mail storage behavior to save each mail in its own file 2026-01-20 09:13:15 +01:00
main.py Started work on pop protocol engine 2026-01-22 00:39:19 +01:00
README.md Added video link for version 2 2026-01-09 15:54:50 +01:00
test.py Done with updating the UML diagramms 2026-01-09 11:21:25 +01:00

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 lhôte du serveur client
    • EHLO domain.com : renvoie une erreur car non-implémenté
    • MAIL FROM:<adresse> : définit l'expéditeur
    • RCPT TO:<adresse> : définit le(s) destinataire(s)
    • DATA : permet l'envoi du corps du message
    • QUIT : ferme la connexion
    • RSET : 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

  1. Cloner le projet ou extraire l'archive

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

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