systeme:projet: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 passe plop
    • 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

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 commande docker ps).
  • docker start postfix permet de redémarrer le docker de nom postfix.
  • docker stop postfix permt d'étindre le docker (sans le supprimer).
  • docker exec -it postfix commande permet d'exécuter la comande commande 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.

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

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.

  • systeme/projet/mail.txt
  • Dernière modification : 2017/04/11 22:15
  • de fabien.rico