Dans ce sujet, nous vous demandons de réaliser un client puis un serveur SMTP en utilisant la bibliothèque Java NIO.
Commencez par créer un nouveau projet Java dans votre environnement que vous appellez tpnote-VotreNom. Créez aussi dans cette arborescence du projet un fichier readme.txt dans lequel vous mettez vos notes. Créez un paquetage smtp dans votre project Eclipse.
Le barème est donné à titre d'indication.
En fin de TP :
Objectif : réaliser des classes qui permettent de réaliser un client puis un serveur SMTP.
Le serveur SMTP que vous devez réaliser doit avoir un comportement identique à celui décrit dans le RFC821. Nous ne vous demandons pas de comprendre l'ensemble du document RFC, mais vous pouvez vous en servir pour lever les ambiguïtés si nécessaire.
Les requêtes SMTP sont décrites plus loin.
Récupérez l'archive smtp.jar
Vous pourrez alors lancer le serveur dans une fenêtre console en tapant la ligne de commande suivante :java -jar smtp.jar -v 2025
Cette ligne de commande lance un serveur SMTP minimal sur le port 2025.
En attendant d'avoir votre client, vous pouvez tester ce serveur minimal en exécutant par exemple la commande :
telnet localhost 2025
La transmission de messages entre le client et le serveur commence par un échange d'identité qui est décrit dans la section 3.5 du RFC :
220 Smtp service ready<CRLF>
HELO client.telecom-sudparis.eu<CRLF>
250 smtp.telecom-sudparis.eu<CRLF>si il accepte la connexion ;
221 Smtp service closed<CRLF>si il n'accepte pas la connexion.
Écrivez la classe SmtpHandshake se connectant au serveur et obtenant le message d'acceptation de connexion du serveur.
Une fois le handshake réussit, les messages sont transmis du client vers le serveur en respectant la séquence décrite dans la section 3.1 du RFC :
MAIL from : user@telecom-sudparis.eu<CRLF>
250 OK<CRLF>
RCPT to : user@telecom-sudparis.eu<CRLF>
250 OK<CRLF>
DATA<CRLF>
354 Start mail input; end with <CRLF>.<CRLF>
Écrivez la classe SmtpSendOneMessage se connectant au serveur et obtenant le message d'acceptation de connexion du serveur puis transmettant un message en respectant ce protocole.
Écrivez une classe SmtpServerHandShake qui :
220 Smtp service ready<CRLF>
250 Nice to meet you
À partir de la classe précédente, écrivez une classe SmtpServerOneMail qui :
MAIL from:et répond si c'est ok par :
250 oksinon par :
501
RCPT to:et répond si c'est ok par :
250 oksinon par :
501
DATAet répond si c'est ok par :
354 Start mail input; end with <CRLF>.<CRLF>sinon par :
503
250 ok
À partir de la classe précédente, écrivez une classe SmtpServerMultiClient qui réalise le même travail que précédemment mais avec plusieurs clients simultanément.
Vous pouvez soit utiliser des Threads soit utiliser un Selector.