Comment définir les parties de l’enveloppe d’un e-mail

2022-11-02 15:46:27  marcredi  11054 mots  

Maintenant que vous connaissez ces généralités, il est temps d’y regarder de plus près. Les sections qui suivent décrivent l’enveloppe d’un e-mail de façon plus précise.

Hôte

L’adresse de l’hôte est l’identificateur utilisé pour une connexion à un serveur. De même qu’une adresse sur une enveloppe n’est pas la position réelle du destinataire, l’adresse de l’hôte ne définit pas le serveur réel, mais plutôt l’emplacement de ce serveur.

La connexion utilisée pour accéder à la combinaison d’une adresse d’hôte et d’un port est appelée socket (c’est comme une prise de courant…). La provenance de ce nom étrange n’a pas d’importance. L’essentiel, c’est que vous pouvez l’utiliser pour trouver toutes sortes d’informations utiles pour comprendre comment fonctionne la messagerie électronique. Les étapes qui suivent vont vous aider à voir tout cela en action. Ce qui compte le plus, c’est de bien comprendre l’idée générale sur ce qu’est l’enveloppe d’un e-mail et les adresses qu’il contient.

  1. Ouvrez une fenêtre de Python en mode Shell.
    Vous voyez l’indicatif habituel.
  2. Tapez import socket et appuyez sur Entrée.
    Pour pouvoir travailler avec des sockets, vous devrez tout d’abord importer la bibliothèque correspondante. Celle-ci contient toutes sortes d’attributs compliqués, et il faut donc s’en servir en prenant des précautions. Mais on y trouve aussi des fonctions intéressantes qui peuvent vous aider à mieux voir comment sont gérées les adresses Internet.
  3. Tapez socket.gethostbyname("localhost") et appuyez sur Entrée.
    Vous voyez s’afficher une adresse d’hôte, en l’occurrence 127.0.0.1 qui est l’adresse standard associée au nom d’hôte localhost (en fait, celle de votre propre système).
  4. Tapez socket.gethostbyaddr("127.0.0.1") et appuyez sur Entrée.
    Attendez-vous à une surprise. Vous obtenez en fait un tuple dont le contenu peut éventuellement vous laisser quelques doutes sur ce qui se passe dans votre machine. Vous constatez cependant que le nom de votre machine est bien présent dans la liste.
  5. Tapez socket.gethostbyname("www.aimerfr.com") et appuyez sur Entrée.
    Vous voyez s’afficher la sortie illustrée sur la Figure. Il s’agit du site Web d’un éditeur bien connu… Le point principal 要点, c’est que cette adresse fonctionne où que vous vous trouviez, et quoi que vous fassiez, exactement comme si elle était inscrite sur une enveloppée papier. Un service postal utilise des adresses qui sont uniques, et l’Internet agit de la même manière.
    Figure : Les adresses que vous utilisez pour envoyer des e-mails sont uniques.
    >>> socket.gethostbyname("www.aimerfr.com")
    '199.33.112.227'

     

  6. Vous pouvez refermer la fenêtre de Python.

Port

Un port est un point d’entrée spécifique dans un serveur. L’adresse de l’hôte spécifie l’emplacement, mais le port définit où précisément entrer. Même si vous ne précisez pas un numéro de port chaque fois que vous utilisez une adresse d’hôte, cette information est implicite. L’accès est toujours autorisé en combinant l’adresse de l’hôte et le port. Les étapes qui suivent illustrent ce mode de fonctionnement.

  1. Ouvrez une fenêtre de Python en mode Shell.
    Vous voyez l’indicatif habituel.
  2. Tapez import socket et appuyez sur Entrée.
    Rappelez-vous qu’un socket fournit à la fois l’adresse de l’hôte et le port. Vous l’utilisez pour créer une connexion qui comprend ces deux éléments.
  3. Tapez socket.getaddrinfo("localhost", 110) et appuyez sur Entrée.
    La première valeur est le nom de l’hôte sur lequel vous voulez obtenir des informations. La seconde valeur est un numéro de port sur cet hôte, en l’occurrence le port 110.
    Vous obtenez une sortie semblable à celle qui est illustrée sur la Figure. Elle est formée de deux tuples : l’un pour le protocole Internet version 6 (IPv6), l’autre pour le protocole Internet version 4 (IPv4). Chaque tuple contient plusieurs entrées dont vous n’avez en fait pas à vous soucier, puisque vous n’en aurez vraisemblablement jamais besoin. Cependant, la dernière entrée, (’127.0.0.1’, 110), vous montre l’adresse et le port pour l’hôte local.
    Figure : L’hôte local fournit des adresses IPv6 et IPv4.
    >>> socket.getaddrinfo("localhost", 110)
    [(<AddressFamily.AF_INET6: 23>, 0, 0, '', ('::1', 110, 0, 0)), (<AddressFamily.AF_INET: 2>, 0, 0, '', ('127.0.0.1', 110))]

     

  4. Tapez socket.getaddrinfo("www.pourlesnuls.fr", 80) et appuyez sur Entrée.
    La Figure illustre la sortie produite par cette commande. Remarquez qu’elle donne uniquement une adresse IPv4 pour le port 80 du site. La méthode socket.getaddrinfo() fournit une indication utile pour déterminer comment vous pouvez accéder à un emplacement particulier. Notez qu’à ce jour, la quantité d’adresses IPv4 est proche de la saturation, le nouveau protocole IPv6, beaucoup plus efficace, prenant du temps à se déployer.
  5. Tapez socket.getservbyport(25) et appuyez sur Entrée.
    Vous pouvez voir la sortie illustrée sur la Figure. La méthode socket. getservbyport() fournit le moyen de déterminer comment est utilisé un certain port. Le port 25 est dédié au support SMTP sur tous les serveurs. Si vous accédez par exemple à l’adresse 127.0.0.1:80, vous demandez en fait le serveur SMTP sur l’hôte local. En résumé, un port fournit un type spécifique d’accès dans de nombreuses situations.
    Figure : La plupart des emplacements Internet ne fournissent qu’une adresse IPv4.

    Figure : Les ports standardisés procurent des services spécifiques sur chaque serveur.
    socket.getservbyport(25)
    'smtp'

     

  6. Vous pouvez refermer la fenêtre de Python.

L’information sur le port n’est pas toujours disponible. Lorsque vous ne précisez pas de port, Python utilise une valeur par défaut. Cependant, faire confiance à ce port par défaut n’est pas une bonne idée, car vous ne savez pas exactement à quel service vous accédez. De plus, certains systèmes se servent d’affectation non standard des ports pour des raisons de sécurité. Vous devriez donc prendre l’habitude d’utiliser le numéro du port et de vous assurer qu’il correspond bien à la tâche que vous voulez réaliser.

Nom d’hôte local

Il s’agit simplement de la forme lisible par un être humain de l’adresse de l’hôte. En fait, les humains ont du mal à comprendre quelque chose comme 127.0.0.1 (et c’est encore bien pire pour la version IPv6). Par contre, un nom d’hôte local est bien plus facile à saisir. Il y a un serveur spécial et une configuration tout aussi spéciale qui permet de traduire les noms locaux en adresses d’hôtes, mais vous n’avez pas à vous en soucier dans ce livre (ni plus généralement ailleurs). Mais il est utile d’avoir quelques notions à ce sujet si votre application se plante soudainement sans raison apparente.

La section « Hôte », plus haut dans ce chapitre, vous a présenté la méthode socket.gethostbyaddr(), qui transforme une adresse en nom d’hôte. Vous avez aussi vu le processus inverse avec la méthode socket.gethostbyname(). Les étapes qui suivent vous aideront à saisir certaines nuances lors du travail avec le nom d’hôte :

  1. Ouvrez une fenêtre de Python en mode Shell.
    Vous voyez l’indicatif habituel.
  2. Tapez import socket et appuyez sur Entrée.
  3. Tapez socket.gethostname() et appuyez sur Entrée.
    Vous voyez s’afficher le nom de votre système local, comme l’illustre la Figure. Bien entendu, le nom de votre propre système est différent du mien. Mais le principe est le même dans tous les cas.
    Figure : Vous avez parfois besoin de connaître le nom du système local.
  4. Tapez socket.gethostbyname(socket.gethostname()) et appuyez sur Entrée.
    Vous voyez maintenant l’adresse IP du système local, comme l’illustre la Figure. Là encore, ce que vous obtenez chez vous est différent de ce qui apparaît sur la figure. Mais il s’agit d’une méthode que vous pouvez utiliser dans vos applications afin de déterminer l’adresse de l’expéditeur. Cette méthode fonctionne sur n’importe quel système.
    Figure : Évitez chaque fois que possible d’utiliser des valeurs figées pour le système local.
    socket.gethostbyname(socket.gethostname())
    '192.168.50.185'

     

Commentaire