Projet Client/Serveur de mail
Voila le sujet du projet : tp5.pdf je rappelle que le dernier td parle du protocole à implémenter.
- un lien d'explication sur le protocole SMTP http://broux.developpez.com/articles/protocoles/smtp/
- Un lien qui présente la librairie argp qui facilite la gestions des options (seulement sous linux) https://www.gnu.org/software/libc/manual/html_node/Argp-Examples.html
- Pour tester le client (et pour être relai de la partie serveur) vous devez utiliser la machine 192.168.75.76 port 443
- Ce serveur n'accepte les mails que pour root@asr5.univ-lyon1.fr ou chaprot@asr5.univ-lyon1.fr.
- Tous ces mails arrivent à l'utilisateur chaprot
- Vous pouvez consulter les mails de l'utilisateur via l'interface webmail http://192.168.75.76/. Attention, cette interface est très basique et il faut cliquer sur refresh pour voir apparaître les nouveau mails. Le login de l'utilisateur est
chaprot
et son mot de passeplop
- Ce serveur n'est pas utilisable depuis l'extérieur du réseau de l'université (sauf à créer des tunnel ssh).
- Pour travailler depuis chez vous voila une image docker à utilsier contenant le serveur mail de test postfix_asr5.tar.gz
- Pour utiliser le docker vous devez l'installer comme expliqué ici https://docs.docker.com/engine/installation/
- Puis une fois que docker est installé, les 2 commandes suivante crée un serveur mail qui écoute sur le port localhost:8125 et un webmail qui propose les mail de l'utilisateur chaprot (mot de passe plop) sur l'adresse http://localhost:8181 :
sudo docker load -i postfix_asr5.tar.gz sudo docker run -dit -p 8181:80 -e PRAYER_HOSTNAME=localhost:8181 -p 8125:25 --name postfix postfix_asr5
Docker
Voila quelques commandes docker utiles :
docker run …
permet de créer et de lancer un docker. En plus de cette création, les option -p permettent le partage de port. -p 8125:25 permet le partage du port local de la machine 8125 avec celui du port 25 du docker (c'est à dire le serveur mail du docker. Dans la commande proposée, les 2 options permettent :- de contacter le serveur web du docker depuis l'URL http://localhost:8181;
- de contacter le serveur mail du docker avec l'adresse loalhost:8125.
docker ps
permet de lister les docker existant et actif. Si elle ne donne pas de résultat, aucun de vos docker ne fonctionne actuellement.docker ps -a
permet de voir tout les docker même ceux qui sont éteints.docker rm postfix
permet de supprimer le docker dont le nom est postfix (on connait le nom grâce à la commandedocker ps
).docker start postfix
permet de redémarrer le docker de nompostfix
.docker stop postfix
permt d'étindre le docker (sans le supprimer).docker exec -it postfix commande
permet d'exécuter la comandecommande
dans le docker. Par exemple :
docker exec -it postfix tail -f /var/log/postfix/mail.log
permet d'afficher les logs du serveur mail interne au docker.
Correction de problèmes
En cas de soucis avec votre docker :
- Vérifiez que vous êtes root où que votre utilisateur à les droits nécessaires
$ sudo su
- Relancez le service docker
$ service docker restart
- Lister les docker actifs et non actifs
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 419de2d94f74 postfix_asr5 "/usr/local/sbin/runs" 3 weeks ago Up 4 minutes 25/tcp, 465/tcp, 587/tcp, 0.0.0.0:8181->80/tcp postfix
Le résultat précédant permet de savoir que le docker postfix est actif
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 419de2d94f74 postfix_asr5 "/usr/local/sbin/runs" 3 weeks ago Up 6 minutes 25/tcp, 465/tcp, 587/tcp, 0.0.0.0:8181->80/tcp postfix ce145b15a4ad apachephpcas "/usr/sbin/apache2ctl" 4 months ago Exited (137) 3 months ago apache
Le résultat précédant permet de savoir que le docker apache est éteint depuis 3 mois.
- S'il est éteint relancer le docker avec
docker start postfix
- S'il ne démarre toujours pas, supprimer puis recréer le docker
$ docker rm -f postfix $ docker run -dit -p 8181:80 -e PRAYER_HOSTNAME=localhost:8181 -p 8125:25 --name postfix postfix_asr5
Mail avec un pièce jointe
Vous trouverez ici un exemple de mail avec un pièce jointe.
Le fait que le mail est composé de plusieurs partie est déclaré dans l'entête :
Content-Type: multipart/mixed; boundary="------------09D7C080709C636310FA900E"
Ce qui signifie que le contenu du mail est composé de plusieurs partie et que ces parties sont de type divers (ce que dit le Content-Type
) mais aussi que pour reconnaitre les différentes parties il faut rechercher la chaine ————09D7C080709C636310FA900E
De plus chacune des parties contient un petit descriptif au début :
Par exemple pour le corps du mail :
--------------09D7C080709C636310FA900E Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit
Et pour un fichier binaire:
--------------09D7C080709C636310FA900E Content-Type: application/x-gzip; name="SockLib.tar.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="SockLib.tar.gz"
Cet entête permet au logiciel lecteur de mail de choisir le bon outils pour ouvrir ce fichier (du text/plain
est affiché tel quel, du application/x-gzip
est affiché avec un petit icone d'archive et si vous cliquez dessus, cela lance un logiciel pour extraire l'archive).
Enfin, le contenu du fichier est souvent problématique car la plupart du temps, ce sont des données binaires alors que le mail est fait pour transporter du texte anglophone organisé par des lignes. Pour faire cela, le plus simple est d'utiliser l'encodage base64. C'est un encodage simple (voir la commande base64 sous linux) où 3 octets sont codées pas 4 caractère codé sur 7 bits (les caractères anglais sans accents). Vous pouvez voir dans le mail que le contenu du fichier C est par exemple encodé en base 64 :
--------------09D7C080709C636310FA900E Content-Type: text/plain; charset="UTF-8"; name="code1.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="code1.c" I2luY2x1ZGU8c3RkaW8uaD4KCmludCBsaXRfY2FyKCkgewogIGludCBjOwogIHdoaWxlKChjID0g Z2V0YyhzdGRpbikpIT1FT0YpIHsKICAgIGlmIChjICE9ICdcbicpIGJyZWFrOwogIH0KICAKICBy ZXR1cm4gYzsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogIGludCBjOwog IEZJTEUgKmYgPSAgIGZvcGVuKCJ0ZXN0LnR4dCIsICJhKyIpOwoKCgogIGMgPSBsaXRfY2FyKCk7 CgogIGZwcmludGYoc3Rkb3V0LCAibGUgY2FycmFjdMOocmUgdGFww6kgZXN0ICVjXG4iLCBjKTsK CgogIGZjbG9zZShmKTsKCiAgcmV0dXJuIDA7Cn0K
Dans cet encodage, I2luY2x1ZGU8
signifie #include<
. Pour faire l'encodage et le décodage, on trouve beaucoup de fonctions par exemple
ici.