X. Les fonctions réseau de PHP▲
Nous abordons maintenant les fonctions réseau de PHP qui nous permettent de faire de la programmation TCP / IP (Transfer Control Protocol / Internet Protocol).
X-A. Obtenir le nom ou l'adresse IP d'une machine de l'Internet (inet_01)▲
Résultats :
Commentaires
- ligne 4 : on demande à ce que les erreurs d'exécution ne soient pas affichées.
Les fonctions réseau de PHP sont utilisées dans la fonction getIpandName de la ligne 15.
- ligne 18 : la fonction gethostbyname($nom) permet d'obtenir l'adresse IP "ip3.ip2.ip1.ip0" de la machine s'appelant $nom. Si la machine $nom n'existe pas, la fonction rend $nom comme résultat.
- ligne 22 : la fonction gethostbyaddr($ip) permet d'obtenir le nom de la machine d'adresse $ip de la forme "ip3.ip2.ip1.ip0". Si la machine $ip n'existe pas, la fonction rend $ip comme résultat.
X-B. Un client web (inet_02)▲
Un script permettant d'avoir le contenu de la page index d'un site web.
Résultats : par exemple, le fichier reçu pour le site [www.ibm.com] :
- les lignes 1-11 sont les entêtes HTTP de la réponse du serveur
- ligne 1 : le serveur demande au client de se rediriger vers l'Url indiquée ligne 8
- ligne 2 : date et heure de la réponse
- ligne 3 : identité du serveur web
- ligne 4 : contenu envoyé par le serveur. Ici une page HTML qui commence ligne 13
- ligne 12 : la ligne vide qui termine les entêtes HTTP
- lignes 13-19 : la page HTML envoyée par le serveur web.
Commentaires du code :
- ligne 7 : la liste des Url des sites web dont on veut la page index. Celle-ci sera stockée dans le fichier texte [nomsite.html].
- ligne 11 : la fonction getIndex fait le travail
- ligne 19 : la fonction getIndex($site) télécharge la page racine (ou page index) du site web $site et la stocke dans le fichier texte $site.html.
- ligne 27 : la fonction fsockopen($site,$port) permet de créer une connexion avec un service TCP / IP travaillant sur le port $port de la machine $site. Une fois la connexion client / serveur ouverte, de nombreux services TCP / IP échangent des lignes de texte. C'est le cas ici du protocole HTTP (HyperText Transfer Protocol). Le flux du serveur parvenant au client peut alors être traité comme un fichier texte. Il en est de même pour le flux partant du client vers le serveur.
- ligne 38 : la fonction fputs permet au client d'envoyer des données au serveur. Ici la ligne de texte envoyée a la signification suivante : "Je veux (GET) la page racine (/) du site web auquel je suis connecté. Je travaille avec le protocole HTTP version 1.0". La version actuelle de ce protocole est 1.1.
- ligne 42 : les lignes de texte de la réponse du serveur peuvent être lues ligne par ligne avec une boucle while et enregistrées dans le fichier texte [$site.html]. Lorsque le serveur web a envoyé la page qu'on lui a demandée, il ferme sa connexion avec le client. Côté client, cela sera détecté comme une fin de fichier.
X-C. Un client smtp (inet_03)▲
Parmi les protocoles TCP / IP, SMTP (SendMail Transfer Protocol) est le protocole de communication du service d'envoi de messages.
Notes :
- sur une machine Windows possédant un antivirus, ce dernier empêchera probablement au script Python de se connecter au port 25 d'un serveur SMTP. Il faut alors désactiver l'antivirus. Pour McAfee par exemple, on peut procéder ainsi :
- en [1], on active la console VirusScan
- en [2], on arrête le service [Protection lors de l'accès]
- en [3], il est arrêté
Le script :
Le fichier infos.txt :
- ligne 1 : [smtp.orange.fr] le serveur utilisé pour l'envoi du courrier, [serge.tahe@univ-angers.fr] l'adresse de l'expéditeur, [serge.tahe@istia.univ-angers.fr] l'adresse du destinataire
- ligne 2 : entêtes du message. Ici il n'y en a qu'un, celui du sujet du message.
- ligne 3 : la ligne vide termine les entêtes du message
- lignes 4-7 : le texte du message
Les résultats écran :
- ligne 1 : message de suivi d'exécution du script
- ligne 2 : première réponse du serveur smtp. Elle fait suite à la connexion du client sur le port 25 du serveur smtp. Les réponses du serveur sont des lignes de la forme [xxx message] ou [xxx-message]. La première syntaxe indique que la réponse est terminée. xxx est un code de résultat. Une valeur supérieure ou égale à 500 signale une erreur. La seconde syntaxe indique que la réponse n'est pas terminée et qu'une autre ligne va suivre.
- ligne 2 : le serveur smtp indique qu'il est prêt à recevoir des commandes
- ligne 3 : le client envoie la commande [EHLO nomDeMachine] où nomDeMachine est le nom internet de la machine sur laquelle s'exécute le client
- lignes 4-10 : réponse du serveur smtp
- ligne 11 : le client envoie la commande [MAIL FROM: <expéditeur>] qui indique l'adresse mail de l'expéditeur.
- ligne 12 : le serveur smtp indique qu'il accepte cette adresse. Il aurait pu la refuser si sa syntaxe avait été incorrecte. Ceci dit, il ne pas vérifie que l'adresse électronique existe vraiment.
- ligne 13 : le client envoie la commande [RCPT TO: <destinataire>] qui indique l'adresse mail du destinataire du message.
- ligne 14 : le serveur smtp répond qu'il accepte cette adresse. Là encore, une vérification syntaxique est faite.
- ligne 15 : le client envoie la commande [DATA] qui indique à l'utilisateur que les lignes qui vont suivre sont celles du message.
- ligne 16 : le serveur répond que le message peut être envoyé. Celui-ci est une suite de lignes de texte qui doit se terminer par une ligne formée d'un seul caractère, un point.
- lignes 17-25 : le message envoyé par le client
- lignes 17- 19 : les entêtes du message [From:, To:, Subject:] servent à indiquer respectivement l'expéditeur, le destinataire et le sujet du message.
- ligne 20 : ligne vide qui signale la fin des entêtes
- lignes 21-23 : le corps du message
- ligne 24 : la ligne formée d'un unique point qui signale la fin du message.
- ligne 26 : le serveur smtp répond qu'il accepte le message
- ligne 27 : le client envoie la commande [QUIT] pour indiquer qu'il a terminé
- ligne 28 : le serveur smtp lui répond qu'il va fermer la connexion qui le lie au client
Commentaires du code
Nous détaillerons peu le code du script car il a été abondamment commenté.
- lignes 48-80 : la fonction qui exploite le fichier [infos.txt] qui contient le message à envoyer ainsi que les informations nécessaires à cet envoi. Elle rend un tableau ($erreur, $smtpServer, $expéditeur, $destinataire, $messge) avec :
- $erreur : un message d'erreur éventuel, vide sinon.
- $smtpServer : le nom du serveur smtp auquel il faut se connecter
- $expéditeur : l'adresse mail de l'expéditeur
- $destinataire : l'adresse mail du destinataire
- $message : le message à envoyer. Outre le corps du message, il peut y avoir des entêtes.
- lignes 84-157 : la fonction sendMail se charge d'envoyer le message. Ses paramètres sont les suivants :
- $smtpServer : le nom du serveur smtp auquel il faut se connecter
- $expéditeur : l'adresse mail de l'expéditeur
- $destinataire : l'adresse mail du destinataire
- $message : le message à envoyer.
- $verbose : à 1 indique que les échanges avec le serveur smtp doivent être reproduits sur la console.
La fonction sendMail rend un message d'erreur, vide s'il n'y a pas eu d'erreur.
- ligne 88 : permet d'obtenir le nom windows d'un ordinateur opérant avec l'OS windows.
- ligne 99 : nous avons vu que le dialogue client / serveur était une suite de la forme :
- envoi par le client d'une commande sur une ligne
- réponse du serveur sur une ou plusieurs lignes
La fonction sendCommand permet de faire un échange client / serveur. Elle rend un message d'erreur qui est vide s'il n'y a pas d'erreur. - lignes 161-208 : la fonction sendCommand admet les paramètres suivants :
- $connexion : le canal TCP / IP qui lie le client au serveur
- $commande : la commande à envoyer sur ce canal. La réponse du serveur à cette commande sera lue.
- $verbose : à 1 indique que les échanges avec le serveur smtp doivent être reproduits sur la console.
- $withRCLF : à 1 indique qu'il faut ajouter la marque de fin de ligne "\r\n" à la fin de la commande
- ligne 173 : envoi de la commande par le client
- ligne 181 : lecture de la première ligne de la réponse du serveur smtp de la forme xxx texte ou xxx-texte. Ce dernier cas indique que le serveur a une autre ligne à envoyer. xxx est le code d'erreur envoyé par le serveur.
- ligne 188 - récupération du code d'erreur de la réponse
- lignes 191-199 : lecture des autres lignes de la réponse
- lignes 203-204 : si le code d'erreur est >=500, alors c'est que le serveur smtp signale une erreur.
X-D. Un second programme d'envoi de mail (inet_04)▲
Ce script a la même fonctionnalité que le précédent : envoyer un mail. Nous utilisons pour cela des modules de la bibliothèque PEAR. Cette bibliothèque comporte des dizaines de modules couvrant différents domaines. Nous allons utiliser les suivants :
- Net/SMTP : un module permettant de dialoguer avec un serveur SMTP
- Mail : un module permettant de gérer l'envoi d'un mail selon différents protocoles.
- Mail/Mime : un module permettant de créer un message qui peut comporter des documents attachés.
Pour disposer de ces modules, il faut d'abord les installer sur la machine exécutant le script PHP. L'installation du paquetage logiciel WampServer a installé un interpréteur PHP. Dans l'arborescence de celui-ci, il est possible d'installer des modules PEAR.
- en [1], le dossier d'installation de l'interpréteur PHP
- en [2], le dossier PEAR qui contiendra les modules PEAR qui vont être installés
- en [3], le fichier de commandes [go-pear.bat] qui initialise la bibliothèque PEAR
Pour initialiser la bibliothèque PEAR, on ouvre une fenêtre DOS et on exécute le fichier [go-pear.bat]. Ce script va se connecter au site internet de la bibliothèque PEAR. Il faut donc une connexion internet.
Connecté au site internet de la bibliothèque PEAR, le script va télécharger un certain nombre d'éléments. Parmi ceux-ci, un nouveau script [pear.bat]. C'est avec ce script qu'on va installer les différents modules PEAR dont nous avons besoin. Ce script s'appelle avec des arguments. Parmi ceux-ci l'argument [help] permet d'avoir une liste des commandes acceptées par le script :
La commande [install] permet d'installer des modules PEAR. On peut demander de l'aide sur la commande [install] :
Les modules PEAR à installer sont les suivants : [Mail], [Mail_Mime], [Net_SMTP]. Dans la fenêtre Dos, on tapera successivement les commandes suivantes :
où <php_installDir> est le dossier d'installation de l'interpréteur PHP (C:\serveursSGBD\wamp21\bin\php\PHP5.3.5 dans cet exemple)
On peut voir les modules installés :
Les modules sont installés dans le dossier <php_installDir>/PEAR :
Avec les modules PEAR installés, le script PHP d'envoi de mail devient le suivant :
Le fichier [mail2.txt] :
- ligne 1 : dans l'ordre, le serveur SMTP, l'adresse de l'expéditeur, l'adresse du destinataire, le sujet du message, le document à attacher.
- lignes 2-4 : le texte du message
Résultats écran
Commentaires
Le script ne diffère du précédent que par sa fonction sendmail. Nous décrivons celle-ci :
- ligne 6 : les script PHP des modules PEAR ont été installés dans un répertoire qui par défaut n'est pas exploré par l'interpréteur PHP. Afin que celui-ci trouve les modules PEAR, nous définissons nous-mêmes les dossiers que doit explorer l'interpréteur PHP. Il est possible de modifier à l'exécution certains paramètres de configuration de l'interpréteur PHP. Cette modification n'est visible que du script qui la fait et seulement pendant la durée de son exécution. La configuration par défaut de l'interpréteur PHP peut être trouvée dans le fichier <php_installdir>/php.ini. Ce fichier contient des lignes de la forme
clé=valeur
La valeur de la clé peut être modifiée à l'exécution par la fonction ini_set(clé, nouvelle_valeur). La clé pour spécifier le chemin de recherche par l'interpréteur des fonctions et classes PHP référencées par le script est 'include_path'. Ici, nous mettons dans le chemin de recherche à la fois le dossier du script (.) et le dossier PEAR du dossier d'installation de l'interpréteur PHP.
- lignes 7-9 : les scripts PHP d'envoi de mail sont chargés.
- ligne 50 : la fonction sendmail qui se charge d'envoyer le courrier. Ses paramètres sont les suivants :
- $smtpServer : le nom du serveur smtp auquel il faut se connecter
- $expéditeur : l'adresse mail de l'expéditeur
- $destinataire : l'adresse mail du destinataire
- $message : le message à envoyer.
- $sujet : le sujet du message
- $attachement : le nom du document à attacher au message
La fonction sendMail rend un message d'erreur, vide s'il n'y a pas eu d'erreur.
- ligne 56 : création d'un message de type Mail_Mime. Ce message est composé d'entêtes (From, To, Subject) et d'un corps (le message lui-même)
- ligne 57 : on fixe le corps du message Mail_Mime.
- ligne 58 : on attache un document au message
- ligne 59 : on fixe les entêtes (From, To, Subject) du message Mail_Mime
- ligne 61 : on crée la classe chargée d'envoyer le message Mail_Mime. Le premier paramètre de la méthode est le nom du protocole à utiliser, ici le protocole SMTP. Le second paramètre est un tableau fixant le nom et le port du service smtp à utiliser
- ligne 62 : envoi du message. La méthode send reçoit trois paramètres : l'adresse de l'expéditeur, les entêtes du message Mail_Mime, le corps du message Mail_Mime. La fonction send renvoie le booléen TRUE si l'envoi s'est bien passé, un message d'erreur sinon.