Scripts courants PHP PHP VERSION 4.3



Documents pareils
Stockage du fichier dans une table mysql:

L envoi d un formulaire par courriel. Configuration requise Mail Texte Mail HTML Check-list

Service Déposant: Procédure d installation. Page 1. Service déposant. Procédure d installation Version 2.3

Gilles.Roussel univ-mlv.fr HTTP/1.1 RFC 2068

TP JAVASCRIPT OMI4 TP5 SRC

L3 informatique TP n o 2 : Les applications réseau

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Module http MMS AllMySMS.com Manuel d intégration

Divers éléments. Protocoles d'applications. Un agent Utilisateur. MUA - Agents Utilisateurs de Courriel. Simple Mail Transfer Protocol

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

KAJOUT WASSIM INTERNET INFORMATION SERVICES (IIS) 01/03/2013. Compte-rendu sur ISS KAJOUT Wassim

SERVEUR DE MESSAGERIE

Mise en service HORUS version HTTP

Dans l'article précédent, vous avez appris

FileSender par RENATER - Guide utilisateur

Comment envoyer un en gardant les adresses de ses correspondants confidentielles!!!

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

ENVOI EN NOMBRE DE Mails PERSONNALISES

ISPConfig Documentation

I. Introduction aux fonctions : les fonctions standards

Manuel d'utilisation d'apimail V3

Les sites Internet dynamiques. contact : Patrick VINCENT pvincent@erasme.org

Utilisation de l . Sommaire

Guide de l'utilisateur

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Mode d'emploi détaillé

Espace de travail collaboratif

Note : Ce tutoriel a été réalisé sur GNU/Linux (Ubuntu) avec un serveur LAMP installé en local.

HelpAndManual_unregistered_evaluation_copy GESTIONNAIRE D'ALARMES CENTRALISE OPTIM'ALARM. Manuel d'utilisation

STID 2ème année : TP Web/PHP

FORMATION / CREATION DE SITE WEB / 4 JOURNEES Sessions Octobre 2006

Manuel d utilisation NETexcom

Hébergement WeboCube. Un système performant et sécurisé. Hébergement géré par une équipe de techniciens

Activité sur Meteor. Annexe 1 : notion de client-serveur et notion de base de données

E-TRANSACTIONS. Guide du programmeur API Plug-in. Version 1.1

Déploiement d'une application Visual Studio Lightswitch dans Windows Azure.

LINUX REMPLAÇANT WINDOWS NT

Espace numérique de travail collaboratif

PHP 5.4 Développez un site web dynamique et interactif

Utilisation de l espace personnel (Serveur DATA)

Couche application. La couche application est la plus élevée du modèle de référence.

Serveurs de noms Protocoles HTTP et FTP

Guide d utilisation. Table des matières. Mutualisé : guide utilisation FileZilla

Formulaire pour envoyer un mail

Introduction. PHP = Personal Home Pages ou PHP Hypertext Preprocessor. Langage de script interprété (non compilé)

FORMATION PcVue. Mise en œuvre de WEBVUE. Journées de formation au logiciel de supervision PcVue 8.1. Lieu : Lycée Pablo Neruda Saint Martin d hères

GUIDE D INSTALLATION DE L APPLICATION GECOL SUR

PARAMETRAGE CONSOLE ADMINISTRATION DE MESSAGERIE "VENDOME.EU" NOTICE UTILISATION

Le service FTP. M.BOUABID, Page 1 sur 5

Plateforme PAYZEN. Définition de Web-services

SPOOL 2 VOLUBIS. VOLUBIS Tel rue du Tertre Fax Carquefou cmasse@volubis.fr

Le stockage local de données en HTML5

Envoyer et recevoir son courrier

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

OUAPI Guide d installation Outil d administration de parc informatique. Documentation d installation et de paramétrage

Mettre à jour PrestaShop

Tutoriel d'utilisation du logiciel Thunderbird version 2.0


Manuel d'installation

Initiation à l informatique. Module 7 : Le courrier électronique ( , mail)

Guide Utilisateur - Guide général d'utilisation du service via Zdesktop ou Webmail v.8. Powered by. - media-2001.communication &.

TP Service HTTP Serveur Apache Linux Debian

Administration du Client Web

Mysql. Les requêtes préparées Prepared statements

Authentification avec CAS sous PRONOTE.net Version du lundi 19 septembre 2011

Projet Administration Réseaux

Application de lecture de carte SESAM-Vitale Jeebop

TP réseaux 4 : Installation et configuration d'un serveur Web Apache

Création, analyse de questionnaires et d'entretiens pour Windows 2008, 7, 8 et MacOs 10

Installation de la messagerie EMWAC IMS Sur Windows NT4 serveur ou Windows 2000 serveur

Extension WebEx pour la téléphonie IP Cisco Unified

DOSSIER D'ACTIVITES SUR LE PHP N 03 Créer une base de données MySQL avec PHPMyAdmin

Sauvegarder et restaurer les données PMB

MEDIAplus elearning. version 6.6

Mobyt Intégration HTTP TABLE DES MATIERES

Protocoles DHCP et DNS

contact@nqicorp.com - Web :

Communiquer : le mail Chèque n 7 Module 1

Instructions relatives à l'adaptation de la messagerie électronique

Utilisation de GalaxShare

La messagerie électronique avec La Poste

Service WEB, BDD MySQL, PHP et réplication Heartbeat. Conditions requises : Dans ce TP, il est nécessaire d'avoir une machine Debian sous ProxMox

ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.

Initiation à la programmation en Python

Guide Utilisateur - Guide général d'utilisation du service via Zdesktop ou Webmail v.8. Powered by. Version EXOCA 1

BTS SIO SISR3 TP 1-I Le service Web [1] Le service Web [1]

1. Installation du Module

GUIDE D INSTALLATION. Portaneo Enterprise Portal version 4.0

FOIRE AUX QUESTIONS PAIEMENT PAR INTERNET. Nom de fichier : Monetico_Paiement_Foire_aux_Questions_v1.7 Numéro de version : 1.7 Date :

Seafile, pour simplifier l'accès à ses fichiers, les partager et les synchroniser

Intranet d'établissement avec Eva-web Installation configuration sur serveur 2000 ou 2003 Document pour les administrateurs

KeePass - Mise en œuvre et utilisation

SERVEUR DE MESSAGERIE

La double authentification dans SharePoint 2007

Vous y trouverez notamment les dernières versions Windows, MAC OS X et Linux de Thunderbird.

Transcription:

Scripts courants PHP PHP VERSION 4.3 Les fonctions les plus courantes Les cookies Les sessions Les variables d environement L envoi d email L upload de fichier Manipulation des dossiers et fichiers Les messages d erreurs COMPLEMENT APACHE : Accès restreint par.htaccess

Les fonctions courantes PHP est installé sur les serveurs avec des bibliothèques de fonctions. Chaque bibliothèque a ses spécialités (manipulations de dates, traitement d image, dialogue avec MySQL, traitement du XML, etc ) Vous aurez ici un florilège des fonctions les plus utiles. Une recherche sur Google de type «nomfonction() PHP manuel», où nomfonction est le nom d une fonction, vous donnera le descriptif de la fonction, et celles qui s en approchent par les fonctionnalités. Pèle mêle de fonctions Manipulation des chaînes de caractère Manipulation des dates Accès aux tableaux Pèle mêle de fonctions round(nombre) Arrondi nombre à l entier le plus proche ceil(nombre) Arrondi nombre à l entier supérieur floor(nombre) Arrondi nombre à l entier inférieur max(variable1, variable2 ) Renvoie la valeur de la plus grande variable. min(variable1, variable2 ) Renvoie la valeur de la plus petite variable. rand() Engendre une valeur au hasard comprise entre 0 et 1. empty(variable) Renvoie faux si la variable est définie et a une valeur non nulle. isset(variable) Renvoie vrai si une variable est définie. ereg(motif, chaîne à tester, tableau de résultat) Evalue une expression régulière. ereg_replace(motif, chaîne de remplacement, chaîne à tester)

Evalue une expression régulière et remplace les occurrences trouvées par la chaîne de remplacement. header(chaîne) Produit un en tête http. Elle doit être utilisée avant toute production de texte HTML. Exemple : pour une redirection automatique : header("location : index.php") ; urldecode(chaîne) Traduit une URL en texte clair : "%20" est remplacé par " " urlencode(chaîne) Traduit une chaîne en texte transmissible par URL : " "est remplacé par "%20" htmlentities(chaîne) Remplace tous les caractères spéciaux de chaîne par leurs équivalents HTML. & sera traduit pas &amp ; nl2br(chaîne) Remplace retour à la ligne de chaîne par leurs équivalents HTML <br/> mail(destinataire, sujet, texte, entêtes) Envoie un email au destinataire, contenant le texte, en ajoutant un sujet, et des entêtes supplémentaires (optionnel) md5(chaîne) Renvoie chaîne cryptée suivant l algorithme md5. Manipulation des chaînes de caractère addslashes(chaîne) Ajoute des \ devant les apostrophes, les guillemets et les antislashs de chaîne. stripslashes(chaîne) Retire les \ devant les apostrophes, les guillemets et les antislashs de chaîne. explode(séparateur, chaîne) Divise chaîne en valeurs séparées par séparateur et renvoie le tableau de ces valeurs. implode(tableau, séparateur) Fonction inverse d explode. strlen(chaîne) Renvoie la longueur de chaîne. strchr(chaîne1, chaîn2) Renvoie le contenu de chaîne1 à partir de la première occurrence de chaîne2. Renvoie Faux si rien n est trouvé.

strpos(chaîne1, chaîn2) Renvoie la position de la première occurrence de chaîne2 dans chaîne1. Renvoie Faux si rien n est trouvé. substr(chaîne, début, longueur) Renvoie la sous chaîne de chaîne de longueur longueur à partir de début strrev(chaîne) Renvoie la chaîne miroir de chaîne strtolower(chaîne) Renvoie chaîne mise en minuscule Cf aussi strtoupper Manipulation des dates Le timestamp UNIX est un entier qui correspond au nombre de secondes écoulées depuis le 1 er janvier 1970. Il est plus facile de faire des comparaisons et des calculs sur des entiers que sur des dates. C est pourquoi l utilisation du timestamp s avère souvent judicieux. Attention, pour les dates qui précèdent le 01/01/1970, le timestamp ne peut plus s appliquer. chechdate(mois, jour, an) Contrôle la validité d une date date(format, timestamp) Renvoie la date correspondant à timestamp, ou la date courante si timestamp est omis, et au format indiqué. Le formatage se fait ainsi : a - "am" (matin) ou "pm" (après-midi) A - "AM" (matin) ou "PM" (après-midi) B - Heure Internet Swatch d - Jour du mois, sur deux chiffres (éventuellement avec un zéro) : "01" à "31" D - Jour de la semaine, en trois lettres (et en anglais) : par exemple "Fri" (pour Vendredi) F - Mois, textuel, version longue; en anglais, i.e. "January" (pour Janvier) g - Heure, au format 12h, sans les zéros initiaux i.e. "1" à "12" G - Heure, au format 24h, sans les zéros initiaux i.e. "0" à "23" h - Heure, au format 12h, "01" à "12" H - heure, au format 24h, "00" à "23" i - Minutes; "00" à "59" I (i majuscule) - "1" si l'heure d'été est activée, "0" si l'heure d'hiver. j - Jour du mois sans les zéros initiaux: "1" à "31" l - ('L' minuscule) - Jour de la semaine, textuel, version longue; en anglais, i.e. "Friday" (pour Vendredi) L - Booléen pour savoir si l'année est bissextile ("1") ou pas ("0") m - Mois; i.e. "01" à "12" M - Mois, en trois lettres (et en anglais) : par exemple "Apr" (pour Avril) n - Mois sans les zéros initiaux; i.e. "1" à "12"

r - Format de date RFC 822; i.e. "Thu, 21 Dec 2000 16:01:07 +0200" (ajouté en PHP 4.0.4) s - Secondes; i.e. "00" à "59" S - Suffixe ordinal d'un nombre, en anglais, sur deux lettres : i.e. "th", "nd" t - Nombre de jours dans le mois donné, i.e. "28" à "31" T - Fuseau horaire de la machine ; i.e. "MET" U - Secondes depuis une époque w - Jour de la semaine, numérique, i.e. "0" (Dimanche) to "6" (Samedi) Y - Année, 4 chiffres; i.e. "1999" y - Année, 2 chiffres; i.e. "99" z - Jour de l'année; i.e. "0" à "365" Z - Décalage horaire en secondes (i.e. "-43200" à "43200") date("d m Y") renverra une chaîne de type : «06 03 2006» mktime (heure, minute,seconde,mois,jour,annee ) Renvoie le timestamp UNIX correspondant à la date indiquée. time () Renvoie le timestamp UNIX de la date courante.

Les cookies A noter : Il ne doit pas y avoir de code HTML ou d'instruction d'affichage avant l'écriture d'un cookie!!! Pas même un retour à la ligne vide! Un cookie permet au serveur de laisser une information sur le poste client. Il pourra utiliser cette information dès la connexion suivante, ou quand il en aura besoin, à partir du moment ou le serveur aura défini une date de péremption de son information. $_COOKIE est un tableau associatif. Il fonctionne de la même manière que $_POST ou $_GET. Lire un cookie PHP crée automatiquement une variable : <? $email = $_COOKIE["email"]; // si le cookie n existe pas, $email aura la valeur booléenne FALSE. if($email) {?> Se désabonner <? } else {?> S'abonner <? }?> Ecrire un cookie en utilisant la fonction setcookie() : Cette fonction prend 3 arguments : le nom du cookie, la valeur du cookie, la durée de vie du cookie. <? $duree = 365*24*60*60; // 1 an en secondes! setcookie("email","info@truc.com",time()+$duree); // la fonction time() renvoie le timestamp courant.?> Détruire un cookie, en le vidant : <? setcookie("email");?> On n affecte aucune valeur au cookie, ce qui le vide, équivalent de la valeur NULL. Détruire tous les cookies : <? while(list($nom,$val)=each($_cookie)) setcookie($nom);?> On parcourt le tableua $_COOKIE et on vide chacune des cases au fur et à mesure.

Les sessions A noter : Il ne doit pas y avoir de code HTML ou d'instruction d'affichage avant le démarrage d une session!!! Une session est très comparable aux cookies. Toutefois, l essentiel des informations est stocké par le serveur, et non plus par le client. Seul le numéro de session est envoyé au client, grâce à un cookie. Mais ce cookie est détruit avec la fermeture du navigateur du poste client. $_SESSION est un tableau associatif. Démarrage A écrire en haut de chaque page qui utilise une session <? session_start();?> Déclaration <? $_SESSION["email"]= "info@truc.com";?> Destruction <? session_unregister("email");?> Destruction de toutes <? session_destroy();?>

Les variables d environnement PHP propose toute une série de variables qui sont déjà implantées dans le langage sans que vous ayez à les créer, on les appelle les variables d'environnement. Ces variables appartiennent à la famille des variables globales $_SERVER La plus part de ces variables sont utilisée pour écrire les logs de connexion à votre serveur. Elles ont une utilité pour la sécurisation des scripts, leur adaptation à certaines configurations, et l édition de statistiques de fréquentation. Variables Description Résultat à l'écran (Free.fr) $_SERVER['DOCUMENT_ROOT'] $_SERVER['HTTP_ACCEPT_LANGUAGE'] $_SERVER['HTTP_HOST'] $_SERVER['HTTP_USER_AGENT'] $_SERVER['PATH_INFO'] $_SERVER['PATH_TRANSLATED'] $_SERVER['REQUEST_URI'] $_SERVER['REMOTE_ADDR'] $_SERVER['REMOTE_PORT'] $_SERVER['QUERY_STRING'] $_SERVER['SERVER_ADDR'] $_SERVER['SERVER_ADMIN'] $_SERVER['SERVER_NAME'] $_SERVER['SERVER_SIGNATURE'] $_SERVER['REQUEST_METHOD'] Racine du serveur Langage accepté par le navigateur Nom de domaine du serveur Type de navigateur Chemin web du script Chemin complet du script Chemin du script /var/www/php.proxad.net Fr proxyphp3.free.fr Adresse IP du client 195.132.7.201 Port de la requête HTTP 45039 Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) /d2expert.free.fr/phpdebutant/fichier.php /var/www/free.fr/3/d/2/e/x/d2expert/phpdebutant/fichier.php /d2expert.free.fr/phpdebutant/fichier.php Liste des paramètres var=23&data=ok passés au script Adresse IP du serveur 212.27.32.44 Adresse de l'administrateur email@email.com du serveur Nom local du ser`_veur Type de serveur? Méthode d'appel du script php.proxad.net GET

Mailing Envoyer un email Pour envoyer un email, nous disposons en PHP de la fonction mail(). En voici la syntaxe : boolean mail( string to, string subject, string message [, string headers [, string parameters]]) Seuls les trois premiers arguments sont obligatoires. La fonction retourne true en cas de succés, false dans le cas contraire. L'email est envoyé au destinataire to. L'email a pour sujet subject et le corps de l'email est message. Des entêtes supplémentaires peuvent être ajoutés avec headers. Enfin, des paramètres de commande supplémentaires peuvent être passés avec parameters. PHP les utilisera dans son appel du programme d'envoi de courriel. Voici un exemple basique d'envoi d'un email : <?php mail('adresse@domain.tld', 'Le sujet', 'Exemple d\'envoi d\'email');?> Ca y est, vous avez envoyé un email : )), c'est bien beau tout ça, mais dans l'email que reçoit le destinataire, l'expéditeur n'a pas été défini C'est là que les headers entrent en jeu. Construction des messages Nous allons maintenant construire un message un peu plus compliqué et inclure des entêtes à l'email pour améliorer tout ça. Un entête se présente comme suit : nom de l'entête: contenu de l'entête Notez bien qu'il n'y a pas d'espace entre le nom de l'entête et les deux points, mais qu'il y a ensuite un espace entre les deux points et le contenu de l'entête. Si vous indiquez plusieurs entêtes, vous devez effectuer un retour à la ligne entre chaque entête à l'aide du caractère spécial \n. Exemple de construction des headers et du message, puis envoi : <?php $headers = "From: toto@titi.fr\n";

$headers.= "Reply To: toto@free.fr"; $message = "Salut Alphonse, \n\n"; $message.= "J'espère que tu vas bien!\n"; $message.= "Voila, j'ai découvert un super site :\n"; $message.= "http://www.phpcodeur.net\n\n"; $message.= "Va y jeter un oeil, il est terrible!\n\n"; $message.= "Ciao.\n\n"; $message.= "toto"; mail('alphonse@lycos.fr', 'Super site', $message, $headers);?> Ici, nous avons utilisé l'entête From qui sert (comme vous l'avez deviné) à définir l'adresse email de l'expéditeur, ainsi que l'entête Reply To qui, lui, sert à définir l'adresse de réponse à l'email. Note : Les noms de certains entêtes sont sensibles à la case. Note : L'adresse définie comme expéditeur n'a pas besoin d'être réelle. On comprend maintenant comment les spammeurs s'y prennent. Vous ne vous étonnerez plus si vous recevez un email de Bill Gates ; ) Note : L'adresse définie comme expéditeur n'est pas nécessairement la même que celle indiquée pour l'adresse de réponse Comme on l'a vu, l'opérateur de concaténation (le point devant le caractère =) nous a permis de construire un message un peu plus compliqué. L'ajout des entêtes appropriés nous a permis de définir l'expéditeur, ce qui est la moindre des choses lorsqu'on envoie un email. Il existe différents entêtes qui ont chacun leur utilité (utilité plus ou moins importante). Détails des différents entêtes On l'a vu dans le chapitre précédent, les entêtes nous permettent de fournir de précieuses informations sur l'email. Voici quelques uns des entêtes, et leur utilité : From Définit l'adresse de l'expéditeur. Vous pouvez personnaliser cet entête de cette façon : "Petit toto"<toto@titi.fr> To Listes des adresses, séparées par une virgule, où doit être envoyée l'email

Reply To Définit l'adresse de réponse à l'email, si différente de l'adresse donnée dans l'entête From X Priority Définit le niveau de priorité de l'email. (de 1 à 5) Return Path L'adresse de retour en cas d'erreur (adresse inconnue, etc ). Typiquement, cet entête est ajouté directement par le programme d'envoi de courriel Cc Listes des adresses, séparées par une virgule, où doit être envoyée une copie de l'email (Cc signifie Carbon Copy) Bcc Listes des adresses, séparées par une virgule, où doit être envoyée une copie cachée de l'email (Bcc signifie Blind Carbon Copy) Disposition Notification To Adresse définie pour la réception de la confirmation de lecture (active de ce fait la confirmation de lecture) Content Type Utilisé pour définir le type MIME du contenu de l'email ou d'une partie de l'email, et le jeu de caractère utilisé Content Transfer Encoding Utilisé pour définir l'encodage utilisé pour le contenu de l'email ou une partie de l'email Voici un autre exemple d'envoi d'email en utilisant quelques uns des entêtes sus nommés : <?php $headers = "From: \"toto\"<toto@titi.fr>\n"; $headers.= "Reply To: toto@titi.fr\n"; $headers.= "Cc: alphonse@lycos.fr, georges@usa.com\n"; $headers.= "Bcc: fred@free.fr\n"; $headers.= "X Priority: 1\n"; $headers.= "Content Type: text/plain; charset=\"iso 8859 1\"\n"; $headers.= "Content Transfer Encoding: 8bit"; $subject = 'Un site à voir absolument!'; $message = "Salut à tous, \n\n"; $message.= "Un site super à voir absolument : \n"; $message.= "http://www.phpcodeur.net\n\n"; $message.= "A demain\n\n"; $message.= "toto";

$result = mail('francois@wanadoo.fr', $subject, $message, $headers); if( $result == true ) { echo 'l\'email a bien été envoyé'; } else { echo 'l\'email n\'a pas pu être envoyé!'; }?> Dans l'exemple ci dessus, nous avons envoyé l'email à francois@wanadoo.fr. Nous avons également envoyé une copie de l'email à alphonse@lycos.fr et georges@usa.com (je manque d'inspiration moi ). Une copie cachée a été envoyée à fred@free.fr, et enfin, l'email a une haute priorité. Nous avons également défini le type MIME du contenu de l'email (text/plain) bien que ce ne fut pas nécessaire, les emails étant par défaut dans ce type. Emails au format html Dans l'exemple précédent, j'ai utilité l'entête Content Type pour définir le type MIME de l'email. Réutilisons cet entête en spécifiant cette fois text/html : <?php $headers = "From: \"toto\"<toto@titi.fr>\n"; // on indique qu'on a affaire à un email au format html avec l'entête ci dessous $headers.= "Content Type: text/html; charset=\"iso 8859 1\""; $message_html = "<html><body><b>salut Alphonse</b><br><br>"; $message_html.= "Ca va?<br>"; $message_html.= "<font color=\"red\">c'était juste pour savoir..</font><br><br>"; $message_html.= "A plus<br>"; $message_html.= "<u>toto</u>"; mail('alphonse@lycos.fr', 'Comment tu vas', $message_html, $headers);?> Note : Rappellez vous que certains logiciels de courrier électronique ne gèrent pas les emails au format html. Prévoyons une alternative pour les personnes ne disposant pas d'un logiciel gérant les emails au format html, ou qui désactivent pour des raisons de sécurité l'affichage de ces emails.

Nous allons ici aborder le terme de frontières dans le corps de l'email, un moyen de séparer les différentes parties de l'email, en conformité avec le format MIME 1.0. En d'autres termes, nous allons définir une chaîne de caractères, et l'utiliser pour séparer la partie texte de la partie html. Mais je laisse le code parler pour moi : <?php // on génère une chaîne de caractères aléatoire qui sera utilisée comme frontière $boundary = " =". md5( uniqid ( rand() ) ); $headers = "From: \"toto\"<toto@titi.fr>\n"; // on indique qu'on a affaire à un email au format html et texte et // on spécifie la frontière (boundary) qui servira à séparer les deux parties // ainsi que la version mime $headers.= "MIME Version: 1.0\n"; $headers.= "Content Type: multipart/alternative; boundary=\"$boundary\""; $message_txt = "Salut Alphonse\n\n"; $message_txt.= "Ca va?\n"; $message_txt.= "C'était juste pour savoir..\n\n"; $message_txt.= "A plus\n"; $message_txt.= "toto"; $message_html = "<html><body><b>salut Alphonse</b><br><br>"; $message_html.= "Ca va?<br>"; $message_html.= "<font color=\"red\">c'était juste pour savoir..</font><br><br>"; $message_html.= "A plus<br>"; $message_html.= "<u>toto</u>"; $message = "This is a multi part message in MIME format.\n\n"; $message.= " ". $boundary. "\n"; $message.= "Content Type: text/plain; charset=\"iso 8859 1\"\n"; $message.= "Content Transfer Encoding: quoted printable\n\n"; $message.= $message_txt; $message.= "\n\n"; $message.= " ". $boundary. "\n"; $message.= "Content Type: text/html; charset=\"iso 8859 1\"\n"; $message.= "Content Transfer Encoding: quoted printable\n\n"; $message.= $message_html; $message.= "\n\n"; $message.= " ". $boundary. " \n";

mail('alphonse@lycos.fr', 'Comment tu vas', $message, $headers);?> Respectez bien la construction du message, en particulier les sauts de ligne entre les différents entêtes et les parties proprement dites. Voila, le destinataire recevra un email qui s'affichera au format html dans son logiciel, si celui ci gère ce format, au format texte dans le cas contraire. Emails avec pièces jointes Pour joindre un fichier à votre email, c'est exactement le même principe des frontières que précédemment que nous devons utiliser. Nous allons également utiliser les fonctions de lecture de fichiers pour lire le fichier à joindre. Les fichiers (image, archive zip, etc ) étant de type binaire, nous allons l'encoder en base64, car seules les données de type ascii peuvent être envoyées par email. <?php // on génère une frontière $boundary = ' ='. md5( uniqid ( rand() ) ); // on va maintenant lire le fichier et l'encoder $path = 'chemin/fichier.gif'; // chemin vers le fichier $fp = fopen($path, 'rb'); $content = fread($fp, filesize($path)); fclose($fp); $content_encode = chunk_split(base64_encode($content)); $headers = "From: \"toto\"<toto@titi.fr>\n"; $headers.= "MIME Version: 1.0\n"; $headers.= "Content Type: multipart/mixed; boundary=\"$boundary\""; $message = "Ceci est un message au format MIME 1.0 multipart/mixed.\n\n"; $message.= " ". $boundary. "\n"; $message.= "Content Type: text/plain; charset=\"iso 8859 1\"\n"; $message.= "Content Transfer Encoding: 8bit\n\n"; $message.= "Salut Alphonse, \n\n"; $message.= "Voila le fichier que tu m'as demandé\n"; $message.= "\n"; $message.= " ". $boundary. "\n"; $message.= "Content Type: image/gif; name=\"fichier.gif\"\n"; $message.= "Content Transfer Encoding: base64\n"; // mettez inline au lieu de attachment // pour que l'image s'affiche dans l'email

$message.= "Content Disposition: attachment; filename=\"fichier.gif\"\n\n"; $message.= $content_encode. "\n"; $message.= "\n\n"; $message.= " ". $boundary. " \n"; mail('alphonse@lycos.fr', 'le fichier demandé', $message, $headers);?> Note : Si vous ne connaissez pas le type MIME du fichier que vous envoyez, vous pouvez indiquer application/octet stream. Utiliser des fichiers embarqués dans les emails html Vous avez également la possibilité de joindre un fichier et de l'utiliser directement dans l'email html (fichier image, son ) Cela peut permettre de consulter l'email hors ligne, sans que les images ou autres media ne restent invisibles, faute de connexion au réseau. Cette méthode doit toutefois être utilisée avec parcimonie, le fichier étant joint à l'email, son poids augmente d'autant le poids de l'email et rend plus long le téléchargement de ce dernier. Pour réaliser cela, nous allons faire appel à un nouvel entête : Content ID. Celui ci va nous servir à spécifier l'identifiant du fichier, lequel sera utilisé dans la partie html pour indiquer le fichier joint à utiliser. Voici le code php, très proche de l'exemple précédent : <?php // on génère une frontière $boundary = ' ='. md5( uniqid ( rand() ) ); // on génère un identifiant aléatoire pour le fichier $file_id = md5( uniqid ( rand() ) ). $_SERVER['SERVER_NAME']; // on va maintenant lire le fichier et l'encoder $path = 'chemin/fichier.gif'; // chemin vers le fichier $fp = fopen($path, 'rb'); $content = fread($fp, filesize($path)); fclose($fp); $content_encode = chunk_split(base64_encode($content)); $headers = "From: \"toto\"<toto@titi.fr>\n"; $headers.= "MIME Version: 1.0\n"; $headers.= "Content Type: multipart/related; boundary=\"$boundary\"";

$message = "Ceci est un message au format MIME 1.0 multipart/mixed.\n\n"; $message.= " ". $boundary. "\n"; $message.= "Content Type: text/html; charset=\"iso 8859 1\"\n"; $message.= "Content Transfer Encoding: 8bit\n\n"; $message.= "<html><body>salut Alphonse, <br><br>"; $message.= "Voila le fichier que tu m'as demandé :<br>"; $message.= "<img src=\"cid:$file_id\" alt=\"le fichier demandé\"><br>"; $message.= "<br>@+"; $message.= "\n\n"; $message.= " ". $boundary. "\n"; $message.= "Content Type: image/gif; name=\"fichier.gif\"\n"; $message.= "Content Transfer Encoding: base64\n"; $message.= "Content ID: <$file_id>\n\n"; $message.= $content_encode. "\n"; $message.= "\n\n"; $message.= " ". $boundary. " \n"; mail('alphonse@lycos.fr', 'le fichier demandé', $message, $headers);?> Nous avons ajouté dans les entêtes de la partie du fichier l'entête Content ID avec pour valeur l'identifiant aléatoire que nous avons créé. Pour appeller ensuite le fichier, il nous a suffi d'indiquer comme valeur de l'attribut src de la balise img : cid:identifiant_du_fichier Envoi d'emails à partir d'un serveur local Si vous avez essayé d'envoyer un email à partir d'un serveur local vous avez dù tomber sur un message d'erreur de ce genre : Failed to connect En effet, avant de tenter d'envoyer un email en local, vous devez d'abord configurer correctement le fichier php.ini qui se trouve dans le dossier windows/ (ou winnt, bref, on se comprend). Vous devez éditer le fichier et vous rendre jusqu'à cette rubrique : [mail function] SMTP = localhost ; For Win32 only. sendmail_from = me@localhost ; For Win32 only. ;sendmail_path = ; For Unix only. You may supply arguments as well (default: "sendmail t i") Indiquez dans SMTP l'adresse du serveur SMTP qui doit être utilisé, par exemple celui de votre fournisseur d'accés, et dans sendmail_from l'adresse de retour par défaut (celle qui sera utilisé dans l'entête Return Path)

L upload de fichier Fonctionnement L'upload de fichier via le formulaire adapté se fait non pas par le protocole FTP, mais HTTP. Pour simplifier, les données dont le fichier uploadé est constitué, sont envoyées de la même manière que les données classiques d'un formulaire, mais en utilisant une "frontière" (boundary en anglais) pour séparer les données du fichier des données classiques du formulaire; On parle alors d'un flot de données multiple Tout comme pour les emails donc, chaque partie du flot de données est accompagnée d'entêtes de description (type MIME, taille des données, etc ) Pour en savoir plus, reportez vous à la RFC 1867 Formulaire d'upload Pour uploader un fichier, il nous faut d'abord constituer le formulaire adéquat. En dehors, d'éventuels champs texte, password, checkbox ou autre, il nous faut placer un champ de type file. Il nous faut également spécifier que le formulaire est constitué de plusieurs parties (les données classiques, et les données du fichier). Pour cela, nous ajouterons l'attribut enctype avec la valeur multipart/form data à la balise form du code html. Voici un formulaire de base, avec uniquement le champ de type file et le bouton de soumission : <form method="post" enctype="multipart/form data" action="upload.php"> <p> <input type="file" name="fichier" size="30"> <input type="submit" name="upload" value="uploader"> </p> </form> Nous avons donné au champ de type file le nom "fichier". Cela nous servira pour traiter le fichier uploadé. Vous pouvez également ajouter un champ de type hidden avec pour nom MAX_FILE_SIZE, et comme valeur, la taille maximale en octet que vous autorisez pour le fichier.

Note : Prenez soin de ne pas oublier l'attribut enctype de la balise form, c'est une erreur fréquente! Réception et traitement Une fois le formulaire soumis, et si tout se passe correctement, le fichier est alors copié dans le dossier temporaire des fichiers uploadés [2] mais n'est pas encore présent sur l'espace du site, il nous faudra le copier sur notre espace web. Quoi qu'il arrive, le fichier est supprimé du dossier temporaire à la fin de l'exécution du script. Le fichier uploadé est disponible via le tableau global $_FILES ou directement avec le nom que l'on a donné au formulaire si registar_globals est fixé à «on» dans la configuration de php. Nous avons alors les variables suivantes (avec ici "fichier" pour le nom du champ de type file) $_FILES['fichier']['name'] Contient le nom d'origine du fichier $_FILES['fichier']['tmp_name'] Nom temporaire du fichier dans le dossier temporaire du système $_FILES['fichier']['type'] Contient le type MIME du fichier $_FILES['fichier']['size'] Contient la taille du fichier en octets $_FILES['fichier']['error'] Code de l'erreur (le cas échéant) (disponible à partir de php 4.2.0) Première chose à faire, vérifier que l'opération s'est bien passée en vérifiant la présence du fichier dans le dossier temporaire; pour cela, nous avons à notre disposition la fonction is_uploaded_file(). Ensuite, vérifier ce qui nous a été envoyé; Si on s'attend à une image, on vérifie si l'extension est celle d une image (jpg, jpeg, png, gif, bmp, tif, etc ).

Une fois que l'on est sûr que tout est ok, on copie le fichier sur notre espace web à l'aide de la fonction move_uploaded_file() qui est plus sûre que la fonction copy(), car elle vérifie que le fichier à copier vient bien du dossier temporaire (et donc, provient d'un formulaire d'upload). A partir de php 4.2.0, vous avez également un index error dans le tableau $_FILES['fichier'], vous indiquant plus précisément les raisons d'un éventuel échec. Voici les différents codes et l'erreur leur correspondant : UPLOAD_ERR_OK Valeur : 0; Aucune erreur, le fichier a bien été uploadé UPLOAD_ERR_INI_SIZE Valeur : 1; Le fichier excède le poids autorisé par la directive upload_max_filesize de php.ini UPLOAD_ERR_FORM_SIZE Valeur : 2; Le fichier excède le poids autorisé par le champ MAX_FILE_SIZE s'il a été donné UPLOAD_ERR_PARTIAL Valeur : 3; Le fichier n'a été uploadé que partiellement UPLOAD_ERR_NO_FILE Valeur : 4; Aucun fichier n'a été uploadé Note : Attention, les constantes UPLOAD_ERR_* ne sont disponibles qu'à partir de php 4.3.0. Sur les versions précédentes, il vous faudra utiliser directement les numéros des codes d'erreur. Voici notre fichier php qui traitera les données du formulaire. Nous partons ici du principe que nous voulons un fichier image en réception. <?php if( isset($_post['upload']) ) // si formulaire soumis { $content_dir = 'upload/'; // dossier où sera déplacé le fichier $tmp_file = $_FILES['fichier']['tmp_name']; if(!is_uploaded_file($tmp_file) ) { exit("le fichier est introuvable"); } // on vérifie maintenant l'extension

$type_file = $_FILES['fichier']['type']; if(!strstr($type_file, 'jpg') &&!strstr($type_file, 'jpeg') &&!strstr($type_file, 'bmp') &&! strstr($type_file, 'gif') ) { exit("le fichier n'est pas une image"); } // on copie le fichier dans le dossier de destination $name_file = $_FILES['fichier']['name']; if(!move_uploaded_file($tmp_file, $content_dir. $name_file) ) { exit("impossible de copier le fichier dans $content_dir"); } } echo "Le fichier a bien été uploadé";?> Bien entendu, rien ne vous oblige à garder le nom d'origine (disponible dans $_FILES['fichier']['name']) du fichier lorsque vous le copiez sur votre espace web. Vous pouvez parfaitement lui attribuer un autre nom. Informations complémentaires Le protocole HTTP n'est pas, à l'origine, prévu pour l'upload de fichiers. Cette utilisation doit donc rester marginale, d'autant plus que la taille des fichiers uploadés est limitée par la directive upload_max_filesize dans le fichier de configuration de php. Par défaut, elle est fixée à 2 Mo mais une limite peut également être fixée dans la configuration du serveur. Enfin, la plupart des hébergeurs gratuit désactivent la possibilité d'uploader des fichiers par cette méthode, donc vérifiez d'abord si l'upload est autorisé sur votre serveur ; )

Manipulation des dossiers et fichiers Lire un répertoire Obtenir un pointeur vers le dossier qui nous intéresse <? $rep = "mon_dossier/"; $dir = opendir($rep);?> lire ce dossier en choisissant les dossiers (is_dir) ou les fichiers (is_file) <? function dd($date) { return date("d/m/y H:i:s",$date); } while ($f = readdir($dir)) { if(is_file($rep.$f)) { echo "<li>nom : ".$f; echo "<li>taille : ".filesize($rep.$f)." octets"; echo "<li>création : ".dd(filectime($rep.$f)); echo "<li>modification : ".dd(filemtime($rep.$f)); echo "<li>dernier accès : ".dd(fileatime($rep.$f)); echo "<br><br>"; } }?> enfin fermer le dossier <? closedir($dir);?> Lire un fichier Définir le fichier qui nous intéresse <? $Fnm = "mon_dossier/mon_fichier.ext";?> Vérifier que ce fichier existe bien <? if (file_exists($fnm)) {?> Ensuite soit lire tout le fichier d'un coup dans un tableau <? $tableau = file($fnm);?> Puis afficher ce tableau <? while(list($cle,$val) = each($tableau)) { echo $val."<br>"; }?>