Fiche PHP : Applications partie 1

Objet de la fiche

État de la fiche Terminée validée


Plan de la fiche :

Avant propos

Chaque partie de ce tutorial présente de nouvelles possibilités du PHP qui peuvent être utilisés dans beaucoup d'applications liées aux sites Web.
Beaucoup de fonctions PHP seront ainsi utilisées afin d'illustrer notre propos. Elles seront explicitées chaque fois que cela semblera nécessaire.

Récupérer les informations techniques sur le serveur et sur l'utilisateur

Informations générales (phpinfo())

Syntaxe : echo phpinfo()

Comme tous les systèmes sont configurés différemment, phpinfo() sert généralement à vérifier la configuration ainsi que les variables prédéfinies, pour une plate-forme donnée.

Informations spécifiques ($_SERVER)

$_SERVER est un tableau contenant des informations comme les en-têtes, dossiers et chemins du script. Les entrées de ce tableau sont créées par le serveur web.

Commandes Commentaires Résultats
$_SERVER['AUTH_TYPE'] Méthode d'authentification utilisée par le client pour accéder au script PHP
$_SERVER['PHP_AUTH_USER'] Avec l'authentification HTTP, cette variable est définie à l'utilisateur. Elle est fournie par l'utilisateur.
$_SERVER['PHP_AUTH_PW'] Avec l'authentification HTTP, cette variable est définie au mot de passe. Elle est fournie par l'utilisateur.
$_SERVER['CONTENT_TYPE'] Type Mine
$_SERVER['PHP_SELF'] Nom du script /Tutoriaux/PHP/PHP_Applications01.php
$_SERVER['GATEWAY_INTERFACE'] Version du CGI(Common Gateway Interface) qu'utilise le serveur CGI/1.1
$_SERVER['DOCUMENT_ROOT'] Racine du serveur /mnt/154/sda/3/1/monwebfacile
$_SERVER['HTTP_ACCEPT_LANGUAGE'] Langage accepté par le navigateur
$_SERVER['SERVER_SOFTWARE'] Identification du serveur Apache/ProXad [Jan 23 2019 20:05:55]
$_SERVER['SERVER_PROTOCOL'] Nom du protocole HTTP/1.1
$_SERVER['HTTP_HOST'] Nom de domaine du serveur monwebfacile.free.fr
$_SERVER['HTTP_USER_AGENT'] Type de navigateur Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
$_SERVER['PATH_INFO'] Chemin web du script
$_SERVER['PATH_TRANSLATED'] Chemin complet du script
$_SERVER['REQUEST_URI'] Chemin du script /Tutoriaux/PHP/PHP_Applications01.php
$_SERVER['REMOTE_ADDR'] Adresse IP du client 216.73.216.60
$_SERVER['REMOTE_PORT'] Port de la requête HTTP 48527
$_SERVER['QUERY_STRING'] Liste des paramètres passés au script
$_SERVER['SERVER_ADDR'] Adresse IP du serveur 212.27.63.154
$_SERVER['SERVER_ADMIN'] Adresse de l'administrateur du serveur
$_SERVER['SERVER_NAME'] Nom local du serveur monwebfacile.free.fr
$_SERVER['SERVER_SIGNATURE'] Type de serveur
Apache/ProXad [Jan 23 2019 20:05:45] Server at monwebfacile.free.fr Port 80
$_SERVER['REQUEST_METHOD'] Méthode d'appel du script GET


Récupérer les paramètres URL

Les paramètres peuvent être passés de 2 façons principales.

Dans chacune des méthodes on utilisera la fonction "isset()" pour savoir si la clé du tableau est définie et est différente de NULL. Si la variable est non définie ou NULLE isset() retournera false.

par la méthode post

<form id="adress" style="width:15em" action="go.php" method="post">
<fieldset>
<legend>Formulaire de test</legend>
<label style="display:inline-block;width:3em;">Nom</label>
<input name="n_nom" type="text" size="20" />
<br />
<label style="{display:inline-block;width:3em;">Prénom</label>
<input name="n_prenom" type="text" size="20" />
<br /><br />
<input type="submit" name="submit" value="OK" />
</fieldset>
</form>
Appui sur OK ------------------------->
Les variables sont envoyées masquées en 2 requêtes
go.php

<?php
// Récupération des informations du formulaire
if(isset($_POST['n_nom'])) $nom = $_POST['n_nom'];
if(isset($_POST['n_prenom'])) $prenom = $_POST['n_prenom'];
// Affichage du résultat
echo $prenom.' '. $prenom;
?>

par la méthode get

<a href="go.php?nom=toto&prenom=titi">Envoyer</a> Envoyer
Appui sur OK ------------------------->
Les variables sont envoyées en clair en une seule requête (longueur limitée à 256 octets).
go.php

<?php
// Récupération des informations du formulaire
if(isset($_GET['nom'])) $nom = $_GET['nom'];
if(isset($_GET['prenom'])) $prenom = $_GET['prenom'];
// Affichage du résultat
echo $prenom.' '. $prenom;
?>

de façon mixte : à la fois GET et POST

<form id="adress" style="width:15em" action="go.php?genre=Mr" method="post">
<fieldset>
<legend>Formulaire de test</legend>
<label style="display:inline-block;width:3em;">Nom</label>
<input name="n_nom" type="text" size="20" />
<br />
<label style="{display:inline-block;width:3em;">Prénom</label>
<input name="n_prenom" type="text" size="20" />
<br /><br />
<input type="submit" name="submit" value="OK" />
</fieldset>
</form>
Appui sur OK ------------------------->
Les variables n_nom et n_prenom sont envoyées masquées en 2 requêtes
La variable genre=Mr est envoyée en clair lors de la première requête (longueur limitée à 256 octets).
go.php

<?php
// Récupération des informations du formulaire
if(isset($_POST['n_nom'])) $nom = $_POST['n_nom'];
if(isset($_POST['n_prenom'])) $prenom = $_POST['n_prenom'];

if(isset($_GET['genre'])) $genre = $_GET['genre']; // Affichage du résultat
echo $prenom.' '. $prenom;
?>

Guillemets dans les données en entrée de formulaires

Par défaut, l'interpréteur PHP est installé avec l'option magic_quotes_gpc. Ce qui signifie que des barres obliques inverses (antislash) sont placées devant tout caractère de type guillemets lu dans $_get, $_post ou cookies. Ce mécanisme est implémenté pour éviter des problèmes lorsque ces valeurs sont utilisées en chaines, dans des requêtes sur une base de données car SQL utilise aussi l'apostrophe pour délimiter les chaînes, et aussi \' pour mettre une apostrophe dans une chaîne.

Exemple : si l'utilisateur saisit O'Donnell dans le champ de nom d'un formulaire et que le champ est transmis par post :
$name = $_post['name']; # $name contient : O\'Donnell


Création de qrcode

Généralités sur les codes barres

Un code-barres, ou code à barres, est la représentation d'une donnée numérique ou alphanumérique sous forme d'un symbole graphique.

Il existe 3 familles principales de codes barres :

  • Les codes barres unidimensionnels ou linéaires qui sont principalement utilisés pour des numéros de série, des ID des produits, etc. dans le commerce et l'industrie. Ils sont constitués de barres et d'espaces d'épaisseurs variables en fonction de la règle utilisée (encodage et marqueurs de début et de fin d'information) et des données elles mêmes.
    Code linéaire
    Règle de code-11
    Encode des données numériques [0..9] et [-]
    Code linéaire
    Règle de code-93
    Encode [0..9 A..Z -.$/+% espace]
    Code linéaire
    Règle de code-39 Full ASCII
    Encode des symboles ASCII [0..127]
  • Les codes barres linéaires empilés ainsi nommés car ils sont constitués de plusieurs codes-barres linéaires empilés les uns sur les autres. Ils sont lus verticalement avec un lecteur à balayage automatique.
  • Les codes à barres à deux dimensions sont codés et lus horizontalement ET verticalement. Ils permettent donc de représenter un plus grand nombre de données sur une même surface. C'est dans cette catégorie que ce trouve le code de type qrcode que nous allons générer via PHP. D'autres types existent tels que Code One, Code Aztec, DataMatrix, MaxiCode, Micro QR Code, etc.
    Code en 2D
    Règle DotCode
    DotCode a été conçu pour l'impression d'étiquette haut débit.
    Code en 2D
    Règle MaxiCode
    Encode des données alphanumériques (spécifique USPS)

    Code en 2D Règle QR Code
    Encode des données alphanumériques (Latin-1, Kanji) et des bytes

Un qrcode c'est quoi?

Le code QR ou QR Code (qr pour Quick Response ou réponse rapide) est l'équivalent en 2 D du code barre classique. A la différence d'un code barres classique, le code QR peut contenir beaucoup d'informations: 7089 caractères numériques, 4296 caractères alphanumériques, contrairement au code barres normal qui ne peut stocker que de 10 à 13 caractères!

Ca sert à quoi?

L’utilisation des codes barres s’est développée de façon considérable au cours des quinze dernières années. Depuis l’adoption de la norme UPC par le commerce de détail la fin des années 70, les codes barres font parti de notre quotidien.
Les codes barres offrent une méthode rapide, facile et précise pour saisir des données. Une utilisation judicieuse des codes barres peut réduire les délais nécessaires aux employés pour effectuer certaines tâches et augmenter l’efficacité d'une équipe.

Un code QR est lisible à partir d'un téléphone portable, d'une tablette, d'un équipement équipé d'une caméra. Un programme doit-être téléchargé puis installé sur la machine, ensuite il suffit de prendre en photo le code pour voir son contenu. Le code QR peut comporter du texte, un numéro de téléphone, un SMS, l'adresse d'un site, une adresse mail, une carte annuaire (vcard). Ce contenu peut-être ensuite être traité, exécuté, sauvegardé, imprimé etc..

Générer un qrcode avec la librairie GD PHP 5

Prérequis

D'une part votre serveur doit être en php version 5, et d'autre part cette version doit supporter la librairie gd pour la génération des images. Cela peut être vérifier avec phpinfo() vu précédemment.
Il faut aussi inclure la librairie phpqrcode.php : cette librairie est configurée pour ne nécessiter aucun autre fichier externe. Vous pouvez télécharger cette librairie ICI

Principe

Pour générer un qrcode PHP met à notre disposition la fonction QRcode() qui accepte 8 paramètres.

QRcode::Type
(
    Contenu à mettre dans le QRcode,
    Fichier sauvegarde du résultat ,
    Niveaux de correction,
    Taille des pixels,
    Marge de l'image résultante,
    false,
    Couleur d'arrière plan,
    Couleur des pixels
);

  • Type : format du résultat :
    • QRcode::png() pour générer une image de type png (par défaut).
    • QRcode::svg() pour générer une image de type png.
    • QRcode::jpeg() pour générer une image de type png.
    • QRcode::text() pour générer un fichier de type texte.
  • Contenu à mettre dans le QRcode : données que l'on veut insérer dans le QR code.
  • Fichier sauvegarde du résultat : nom du fichier à générer. Attention à lui donner la bonne extension (png ou jpeg) conforme au type défini précédemment.
  • Niveaux de correction : niveau de redondance pour la correction d’erreur. C’est ce qui fait que le QR code est plus ou moins dense et plus ou moins lisible. Il existe 4 niveaux de correction d’erreur du QR Code L, M, Q, H. L étant le niveau le plus bas.
    • L => niveau de redondance de 7%.
    • M => niveau de redondance de 15%.
    • Q => niveau de redondance de 25%.
    • H => niveau de redondance de 30%.
    Par exemple la valeur H signifie que même si 30 % du qrcode peut être masqué, on retrouvera tout de même les informations.
    Plus la redondance est grande, plus l’information est présente à de multiples endroits et, de ce fait, la perte d’informations est moins impactante sur la lecture complète des informations.
  • Taille des pixels : taille en pixels des carrés à l’intérieur du code (nombre).
  • Marge de l'image résultante : taille en pixels de la bordure autour du QR Code(nombre Min 0 pas de marge, Max 50).
  • false : ce paramètre semble inutilisé. Le mettre à false pour obtenir un fonctionnement correct dans tous les cas.
  • Couleur d'arrière plan : au format hexadecimal. Exemple 0xffffff pour du blanc (nombre hexa).
  • Couleur des pixels : au format hexadecimal. Exemple : 0xc0c0c0 pour du gris (nombre hexa).

Exemple : QRcode::png($donnees, $filename, $ErrorCorrectionLevel, $PointSize, $MargeSize, false, $BackColor, $PixelsColor); avec

$donnees = 'Je suis un petit qui roule';
$filename = 'xxx/kskjjsd/kjk/temp/resultat.png';
$ErrorCorrectionLevel = 'M'; // Niveaux de correction
$PointSize = 6; // Taille des pixels
$MargeSize = 3; // Taille de la marge
$PixelsColor = 0xff8000; // Pixels oranges
$BackColor = 0x000000; // Fond noir

Taille d’un QRCode ?

La taille varie en fonction de plusieurs paramètres :

Soit un qr code de base avec les spécificités suivantes : texte= Bonjour tout le monde, taille pixels = 3px, Niveau correction = L, marge = 0px.

En fonction du taux de redondance (d'informations) demandé
QR code de base Le même avec un niveau de correction maximum (H)
En fonction de la quantité de données à coder
QR code de base Le même avec plus de données : texte= Bonjour tout le monde, comment allez vous ce matin? Pensez vous qu'il va pleuvoir?
En fonction de la dimension des pixels.
QR code de base Le même avec des pixels plus gros (7px)
En fonction de la marge.
QR code de base Le même avec une marge maximun de 5px

Formats de données d'un qr code

Voici quelques formats de données parmi bien d'autres que l'on peut gérer par qr code.

URL

$donnees = "http://monwebfacile.free.fr";

Note : Le format exact est urlto::http://... mais cette syntaxe n'est pas reconnue comme url par certains lecteurs. Préférer coder du texte avec juste l'URL.

email

$donnees = "mailto:monwebfacile@free.fr"

Téléphones

$donnees = "tel:+33102030405"

SMS

$donnees = "smsto:0607080910:Bonjour"

Carte de visite (vcard)

$donnees = 'BEGIN:VCARD'."\n";
$donnees .= 'VERSION:2.1'."\n";
$donnees .= 'N:'.'Mr Doe;John'."\n";
$donnees .= 'FN:'.'John Doe'."\n";
$donnees .= 'ORG:'.'Ophtalmoloque'."\n";
$donnees .= 'TEL;HOME;PREF:'.'0102030405'."\n";
$donnees .= 'TEL;CELL;PREF:'.'0607080910'."\n";
$donnees .= 'TITLE:'.'Mr Doe'."\n";
$donnees .= 'ADR;TYPE=HOME;'.
'LABEL="'.'MON ANNUAIRE'.'":'
.'BOITE'.';'
.'NUMERO'.';'
.'RUE'.';'
.'CODE POSTAL'.';'
.'VILLE'.';'
.'PAYS'
."\n";
$donnees .= 'EMAIL:'.'monwebfacile@free.fr'."\n";
// $codeContents .= 'NOTE;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:'.$notes;
$donnees .= 'END:VCARD';

Personnaliser le qrcode

Fond d'image et couleur des pixels

QRcode::Type
(
    Contenu à mettre dans le QRcode,
    Fichier sauvegarde du résultat ,
    Niveaux de correction,
    Taille des pixels,
    Marge de l'image résultante,
    false,
    Couleur d'arrière plan,
    Couleur des pixels
);

Un générateur de qr code et son code source

Exemple 1

Cette application utilise uniquement du php pour construire sa propre page HTML et afficher le résultat.

Création et modifications d'images à la volée

Présentation

La librairie GD de PHP comporte de nombreuses fonctions permettant d'agir sur les images. Cette librairie, permet entre autre de créer, modifier, editer les propriétés d'images, etc..
Afin de donner un aperçu des possibilités graphiques de GD2 et PHP, on donne ici la liste des fonctions disponibles et 2 exemples détaillés pour mieux en comprendre l'utilisation.

FonctionsCommentaires
gd_infoRetourne des informations à propos de la bibliothèque GD installée
getimagesizeRetourne la taille d'une image
getimagesizefromstringRécupère la taille d'une image depuis une chaîne
image_type_to_extensionRetourne l'extension du fichier pour le type d'image
image_type_to_mime_typeLit le Mime-Type d'un type d'image
image2wbmpAffichage de l'image vers le navigateur ou dans un fichier
imageaffineRetourne une image contenant l'image source transformé, en utilisant optionnellement une zone de découpe
imageaffinematrixconcatConcatène deux matrices
imageaffinematrixgetRetourne une image contenant l'image source transformée, en utilisant optionnellement une zone de découpe
imagealphablendingModifie le mode de blending d'une image
imageantialiasUtiliser ou non les fonctions d'antialias
imagearcDessine une ellipse partielle
imagecharDessine un caractère horizontalement
imagecharupDessine un caractère verticalement
imagecolorallocateAlloue une couleur pour une image
imagecolorallocatealphaAlloue une couleur à une image
imagecoloratRetourne l'index de la couleur d'un pixel donné
imagecolorclosestRetourne l'index de la couleur la plus proche d'une couleur donnée
imagecolorclosestalphaRetourne la couleur la plus proche, en tenant compte du canal alpha
imagecolorclosesthwbLit l'index de la couleur spécifiée avec sa teinte, blanc et noir
imagecolordeallocateSupprime une couleur d'une image
imagecolorexactRetourne l'index de la couleur donnée
imagecolorexactalphaRetourne l'index d'une couleur avec son canal alpha
imagecolormatchFait correspondre un peu plus les couleurs de la version palette d'une image aux couleurs de sa version truecolor
imagecolorresolveRetourne l'index de la couleur donnée, ou la plus proche possible
imagecolorresolvealphaRetourne un index de couleur ou son alternative la plus proche, y compris le canal alpha
imagecolorsetChange la couleur dans une palette à l'index donné
imagecolorsforindexRetourne la couleur associée à un index
imagecolorstotalCalcule le nombre de couleurs d'une palette
imagecolortransparentDéfinit la couleur transparente
imageconvolutionApplique une matrice de la convolution 3x3, en utilisant le coefficient et l'excentrage
imagecopyCopie une partie d'une image
imagecopymergeCopie et fusionne une partie d'une image
imagecopymergegrayCopie et fusionne une partie d'une image en niveaux de gris
imagecopyresampledCopie, redimensionne, rééchantillonne une image
imagecopyresizedCopie et redimensionne une partie d'une image
imagecreateCrée une nouvelle image à palette
imagecreatefromgd2Crée une nouvelle image à partir d'un fichier GD2 ou d'une URL
imagecreatefromgd2partCrée une nouvelle image à partir d'une partie de fichier GD2 ou d'une URL
imagecreatefromgdCrée une nouvelle image à partir d'un fichier GD ou d'une URL
imagecreatefromgifCrée une nouvelle image depuis un fichier ou une URL
imagecreatefromjpegCrée une nouvelle image depuis un fichier ou une URL
imagecreatefrompngCrée une nouvelle image depuis un fichier ou une URL
imagecreatefromstringCrée une image à partir d'une chaîne
imagecreatefromwbmpCrée une nouvelle image depuis un fichier ou une URL
imagecreatefromwebpCrée une nouvelle image depuis un fichier ou une URL
imagecreatefromxbmCrée une nouvelle image depuis un fichier ou une URL
imagecreatefromxpmCrée une nouvelle image depuis un fichier ou une URL
imagecreatetruecolorCrée une nouvelle image en couleurs vraies
imagecropRecadre une image en utilisant les coordonnées, la taille, x, y, hauteur et largeur fournis
imagecropautoRecadre une image automatiquement en utilisant un des modes disponibles
imagedashedlineDessine une ligne pointillée
imagedestroyDétruit une image
imageellipseDessine une ellipse
imagefillRemplissage
imagefilledarcDessine un arc partiel et le remplit
imagefilledellipseDessine une ellipse pleine
imagefilledpolygonDessine un polygone rempli
imagefilledrectangleDessine un rectangle rempli
imagefilltoborderRemplit une région avec une couleur spécifique
imagefilterApplique un filtre à une image
imageflipRetourne une image en utilisant le mode fourni
imagefontheightRetourne la hauteur de la police
imagefontwidthRetourne la largeur de la police
imageftbboxCalcule le rectangle d'encadrement pour un texte, en utilisant la police courante et freetype2
imagefttextÉcrit du texte dans une image avec la police courante FreeType 2
imagegammacorrectApplique une correction gamma à l'image GD
imagegd2Génère une image au format GD2, vers le navigateur ou un fichier
imagegdGénère une image au format GD, vers le navigateur ou un fichier
imagegifAffichage de l'image vers le navigateur ou dans un fichier
imagegrabscreenCapture l'écran complet
imagegrabwindowCapture une fenêtre
imageinterlaceActive ou désactive l'entrelacement
imageistruecolorDétermine si une image est une image truecolor
imagejpegAffichage de l'image vers le navigateur ou dans un fichier
imagelayereffectActive l'option d'alpha blending, pour utiliser les effets de libgd
imagelineDessine une ligne
imageloadfontCharge une nouvelle police
imagepalettecopyCopie la palette d'une image à l'autre
imagepalettetotruecolorConvertit une image basée sur une palette en couleur vraie
imagepngEnvoie une image PNG vers un navigateur ou un fichier
imagepolygonDessine un polygone
imagepsbboxRetourne le rectangle entourant un texte et dessiné avec une police PostScript Type1
imagepsencodefontChange le codage vectoriel d'un caractère dans une police
imagepsextendfontÉtend ou condense une police de caractères
imagepsfreefontLibère la mémoire occupée par une police PostScript Type 1
imagepsloadfontCharge une police PostScript Type 1 depuis un fichier
imagepsslantfontIncline une police de caractères PostScript
imagepstextDessine un texte sur une image avec une police PostScript Type1
imagerectangleDessine un rectangle
imagerotateFait tourner une image d'un angle
imagesavealphaConfigure l'enregistrement des informations complètes du canal alpha lors de sauvegardes d'images PNG
imagescaleMet à l'échelle une image en utilisant une hauteur et une largeur fournies
imagesetbrushModifie la brosse pour le dessin des lignes
imagesetinterpolationDéfini la méthode d'interpolation
imagesetpixelDessine un pixel
imagesetstyleConfigure le style pour le dessin des lignes
imagesetthicknessModifie l'épaisseur d'un trait
imagesettileModifie l'image utilisée pour le carrelage
imagestringDessine une chaîne horizontale
imagestringupDessine une chaîne verticale
imagesxRetourne la largeur d'une image
imagesyRetourne la hauteur de l'image
imagetruecolortopaletteConvertit une image en couleurs vraies en image à palette
imagettfbboxRetourne le rectangle entourant un texte et dessiné avec une police TrueType
imagettftextDessine un texte avec une police TrueType
imagetypesRetourne les types d'images supportés par la version courante de PHP
imagewbmpAffichage de l'image vers le navigateur ou dans un fichier
imagewebpAffiche une image WebP vers un navigateur ou un fichier
imagexbmGénère une image au format XBM
iptcembedIntègre des données binaires IPTC dans une image JPEG
iptcparseAnalyse un bloc binaire IPTC et recherche les balises simples
jpeg2wbmpConvertit une image JPEG en image WBMP
png2wbmpConvertit une image PNG en image WBMP

Ecrire du texte à la volée sur une image avec gd2

Superposer une image sur une autre image à la volée avec gd2

Formulaire et envoi mail

Généralités

Il existe différents moyens pour envoyer un mail en PHP, le plus simple est d'utiliser la fonction mail() dont le format général est mail($destinataire,$sujet,$message,$headers);

Les mails au format texte sont les plus simples car ils ne possèdent pas de mise en forme, pas d'images, ni police spéciale, ni style, etc.. L'avantage de ce type de mail est qu'ils sont lisibles par tous et plus légers que leurs homologues (X)HTML, ce qui est idéal pour les serveurs et les petites connexions.

Les en-têtes (headers)

Généralités.

Les en-têtes sont utilisés dès que l'on aura besoin de personnaliser le mail comme par exemple spécifier une adresse de réponse, plusieurs adresses d'envoi, des copies cachées, etc ...

Principaux en-têtes :

  • From1 : permet de spécifier l'adresse email de l'expéditeur. On peut mettre tout et n'importe quoi comme adresse mail, et donc vous comprennez maintenant pourquoi vous recevez des emails de bill gates en personne (sic) et autres SPAM.
    On l'utilise comme ceci : From: "Nom de l'expéditeur" <adresse mail de l'expéditeur>
  • Reply-To : permet de spécifier l'adresse email de réponse.
    On l'utilise comme ceci : Reply-To: adresse_mail
  • Cc: : permet de spécifier les autres destinataires qui recevront le mail en Cc (Carbon copy), c'est à dire que tous les destinataires pourront voir à qui le message a été transmis.
    On l'utilise comme ceci : Cc:email1,email2,email3...
  • Bcc: : permet de spécifier les autres destinataires qui recevront le mail en Bcc (Blind carbon copy), c'est à dire que les destinataires ne pourront pas voir à qui le message a été transmis, il s'agit d'une copie cachée.
    On l'utilise comme ceci : Bcc: email1,email2,email3...
  • Content-Type : cet en-tête permet de spécifier le type mime du mail et son charset (jeu de caractères).
    On l'utilise comme ceci : Content-Type;text/plain; charset="iso-8859-1". Cet exemple défini un contenu de type texte associé à l'encodage iso-8859-1.
  • Content-Transfer-Encoding2 : permet de spécifier l'encodage du mail ou de l'une de ses parties (utile dans le cas d'un envoi texte + html par exemple). Il peut par exemple prendre les valeurs 7 et 8 bit (l'encodage 7 bit étant utilisé dans les pays anglophones n'ayant pas besoin de gérer les lettres accentuées).
    On l'utilise comme ceci : Content-Transfer-Encoding: 8bit
  • X-Priority : défini le niveau de priorité du mail envoyé. Peut prendre une valeur variant de 1 à 5. Plus ce chiffre est faible, plus haute est la priorité.
    On l'utilise comme ceci : X-Priority:2
  • Disposition-Notification-To : Permet de spécifier l'adresse mail de retour pour la confirmation de lecture.
    Disposition-Notification-To:monwebfacile.free.fr

La fonction mail() prend maintenant un autre argument en paramètre, à savoir les headers que vous aurez tous séparés par des sauts de ligne. Pour faire un saut de ligne dans le message, on utilise \n qui doit être entouré de guillemets doubles et non de guillemets simples. En effet, "\n" est un seul caractère "interprété". '\n' ne fonctionnera donc pas.

Note1 : Attention - Il vaut mieux que l'adresse émettrice (from) ait le même nom de domaine que le serveur envoyant pour éviter d'être pris pour un spam et ainsi non envoyé.

Note2 : Pour transférer des données binaires, MIME propose cinq formats de codage pouvant être utilisé dans l'entête Transfer-encoding :

  • 7bit : format texte codé sur 7 bits (pour les messages non accentués).
  • 8bit : format texte 8 bits.
  • quoted-printable : format Quoted-Printable, recommandé pour les messages utilisant un alphabet codé sur plus de 7 bits (présence d'accents par exemple).
  • base64 : format Base 64, recommandé pour l'envoi de fichiers binaires en pièce jointe.
  • binary : format binaire, déconseillé.

MIME, est très ouvert et permet d'utiliser des formats de codage tiers.

Mail au format HTML

Pour envoyer un mail au format HTML il suffit de modifier le message pour le mettre au format HTML, et modifier le header "content-type" pour dire cette fois-ci que le message est au format HTML.

Voici ce que ça donne en pratique :

Mail au formats texte et HTML

Pour être compatible avec tous les clients mails, il existe une solution : envoyer les mails aux formats texte et HTML. L'avantage de ce type d'envoi est que les clients mails qui n'acceptent pas le HTML verront le mail au format texte tandis que les autres pourront profiter de la mise en page plus évoluée offerte par le HTML.

Voici un exemple de code permettant d'envoyer un mail au format texte et HTML :

Remarques

  • On génère d'abord une frontière (boundary) qui permettra au client mail de séparer les différents contenus. Cette frontière, lorsqu'elle sera utilisée, sera entourée de deux tirets accolés. Après la frontière, on modifie éventuellement les headers appliqués localement (ici le type du message).
  • MIME-Version: 1.0

    MIME apporte à la messagerie les fonctionnalités suivantes :

    • Possibilité d'avoir plusieurs objets (pièces jointes) dans un même message,
    • Une longueur de message illimitée,
    • L'utilisation de jeux de caractères (alphabets) autres que le code ASCII,
    • L'utilisation de texte enrichi (mise en forme des messages, polices de caractères, couleurs, etc.),
    • Des pièces jointes binaires (exécutables, images, fichiers audio ou vidéo, etc.), comportant éventuellement plusieurs parties,
    • MIME utilise des directives d’entête spécifiques pour décrire le format utilisé dans le corps d’un message, afin de permettre au client de messagerie de pouvoir l'interpréter correctement.

    MIME-Version: est la version du standard MIME utilisée dans le message. Actuellement seule la version 1.0 existe.

  • Content-Type: multipart/alternative

    multipart (standard MIME) permet de définir des messages composites, c'est-à-dire des messages comportant plusieurs pièces jointes, éventuellement emboîtées.

    Chaque séparateur délimite un contenu commençant par les entêtes Content-Type et Content-Encoding. Il est essentiel que la valeur de ce séparateur n'existe pas dans le contenu du message.

    Il existe plusieurs types de séparateurs :

    • multipart/mixed définit une suite de plusieurs éléments,
    • multipart/alternative définit différentes alternatives pour une même information, par exemple un message au format texte et HTML. Si le client de messagerie est capable et configuré pour l'afficher avec une mise en forme, il affichera la version HTML, sinon il affichera la version texte,
    • multipart/parallel définit des données présenter en même temps (son et image par exemple),
    • multipart/signed définit une signature numérique pour les données du message,
    • multipart/related définit des informations liées entre elles.
    • Encrypted pour envoyer un contenu chiffré. Sa première partie définit les informations nécessaires pour décrypter la seconde partie (application/octet-stream).

Envoyer des mails avec pièces jointes.

Les frontières (boundary) dans les mails permettent d'envoyer aussi des pièces jointes. Les pièces jointes sont encodées en Base 64 à l'aide de la fonction PHP base64_encode().

Cet encodage est fait pour permettre aux informations binaires d'être manipulées par les systèmes qui ne gèrent pas correctement les 8 bits, comme les corps de mail.

Voici un exemple :

Remarques

  • file_get_contents('nom_du_fichier.jpg') retourne tout le fichier dans une chaîne. On peut aussi ne retourner qu'une partie du fichier en utilisant deux paramètres supplémentaires : offset de départ et longueur.
  • base64_encode(file_get_contents('nom_du_fichier.jpg')) retourne les données encodées, sous la forme d'une chaîne de caractères ou FALSE si une erreur survient.
  • chunk_split(base64_encode(file_get_contents('nom_du_fichier.jpg'))) retourne les données formatées pour suivre la norme RFC 2045.

Exemple

Un petit Forum sur votre site

Cet exemple présente la construction d'un petit Forum qui aprés adaptation peut être sympa sur votre site.

Exemple


Des fonctions utiles

La fonction str_replace(find,replace,string,count)

Utilité

Cette fonction permet de remplacer des caractères par d'autres caractères dans une chaine.

Paramètres

Paramètres Description
find Requis : le caractère ou la chaine à rechercher
replace Requis : caractère ou chaine remplançant le caractère ou la chaine trouvée (find)
string Requis : la chaine à analyser
count Optionnel : variable donnant le nombre de remplacement effectués

Caractères spécifiques pouvant être remplacés

Syntaxe Description
\f caractère break/form feed.
\p retour à la ligne (CR/LF) (paragraphe) (fichiers DOS).
\r retour à la ligne (CR seulement) (paragraphe) (fichiers MAC)
\n retour à la ligne (LF seulement) (paragraphe) (fichiers UNIX)
\t Caractère TAB.
\d digits
\D tous caractères "blancs" (space, tab, form feed, etc.), sauf retour ligne
\s tous caractères non "blancs" (space, tab, form feed, etc.), sauf retour ligne
\v caractère TAB vertical
\w tous caractères alphanumériques incluant sous-ligné
\W tous caractères à l'exeption des caractères alphanumériques et sous-ligné

Exemples

Définitions Fonctions
Cette fonction permet de supprimer tous les espaces dans un chaine. Par exemple vous permettez la saisie d'un numéro de téléphone sous la forme 06 01 02 03 04, mais au niveau du test et du stockage vous voulez 0601020304 $text = "06 01 02 03 04";
$test = str_replace(' ','',$text);

Respectons la propriété intellectuelle