Les emails en PHP
Le courrier électronique est devenu l’un des principaux moyens de communication dans les entreprises. La gestion des emails va permettre d’envoyer des lettres d’informations, de lancer des notifications (prévenir l’internaute des activités du site en tant que membre actif) ou encore de tenir informé les utilisateurs des mises à jour.
Pour le webmaster qui conçoit un site web, il peut mettre en place une page de contact pour permettre à l’internaute de poser des questions ou de déposer des avis.
Envoyer des emails
La gestion des envois d’emails en PHP est simple.On utilise la fonction mail() en lui passant en argumants :
- l’email du destinataire
- le sujet du courrier
- le texte du courrier
<?php
// envoi d'un email à webmaster@tutovisuel.com
mail("webmaster@tutovisuel.com", "Sujet", "Le message\nligne2");
?>
Pour revenir à la ligne dans le message de l’email, vous pouvez utiliser le code du retour chariot \n qui sera transformé en PHP comme un caractère de fin de ligne.
Envoyer un email à plusieurs destinataires
Pour envoyer un email à plusieurs personnes, il faut séparer les adresses des destinataires par des virgules dans le premier paramètre.
<?php
// on sépare les destinataires par une virgule
$Destinataires = "webmaster@tutovisuel.com, dupond@tutovisuel.com";
mail($Destinataires, "Sujet", "Le message\nligne2");
?>
En-têtes d’email
Il est possible de redéfinir les l’en-têtes correspondant, pendant l’envoi d’un email en ajoutant un quatrième paramètre à la fonction email(). Cet argument comprend une chaîne de caractères qui sera rajoutée à la fin des en-têtes. Cela permet de rajouter des en-têtes supplémentaires.
L’en-têtes From définit l’expéditeur du message.
<?php
$destinataires = "webmaster@tutovisuel.com, dupond@tutovisuel.com";
$sujet = "Bienvenue sur Tutovisuel";
// en-têtes expéditeur
$entetes = "From : expediteur@gmail.com\n";
mail($destinataires, $sujet, "Le message\nligne2", $entetes);
?>
Chaque directive d’en-têtes doit avoir le caractère de fin de ligne \n .
Adresse de retour
Pour changer l’adresse de retour on utilise la directive Reply-to. On ajoute cet en-têtes à celui déjà envoyé en utilisant l’opérateur de concaténation .=
<?php
$destinataires = "webmaster@tutovisuel.com, dupond@tutovisuel.com";
$sujet = "Bienvenue sur Tutovisuel";
// en-têtes expéditeur
$entetes = "From : expediteur@gmail.com\n";
// en-têtes adresse de retour
$entetes .= "Reply-to : webmaster@tutovisuel.com\n";
mail($destinataires, $sujet, "Le message\nligne2", $entetes);
?>
Personnes en copie
Il existe trois modes d’adressage : l’envoi à un destinataire défini, l’envoi d’une copie carbonne cc(Carbon Copy) et l’envoi d’une copie carbone en mode caché bbc ( Blind Carbon Copy).
Une copie désigne une personne a mettre au courant et le destinataire est tenu informé. La copie cachée permet de tenir une personne au courant sans que le destinataire en soit informé.
Pour ajouter des personnes de ce type on utilise les directives Cc et Bcc.
<?php
$destinataires = "webmaster@tutovisuel.com, dupond@tutovisuel.com";
$sujet = "Bienvenue sur Tutovisuel";
// en-têtes expéditeur
$entetes = "From : expediteur@gmail.com\n";
// en-têtes adresse de retour
$entetes .= "Reply-to : webmaster@tutovisuel.com\n";
// personnes en copie
$entetes .= "Cc : formateur@tutovisuel.com\n";
$entetes .= "Bcc : impots@tutovisuel.com\n";
mail($destinataires, $sujet, "Le message\nligne2", $entetes);
?>
Priorité du message
Il existre trois niveaux de priorité via la directive X-Priority.
- 5 (basse)
- 3 (normale)
- 1 (urgent)
<?php
$destinataires = "webmaster@tutovisuel.com, dupond@tutovisuel.com";
$sujet = "Bienvenue sur Tutovisuel";
// en-têtes expéditeur
$entetes = "From : expediteur@gmail.com\n";
// en-têtes adresse de retour
$entetes .= "Reply-to : webmaster@tutovisuel.com\n";
// personnes en copie
$entetes .= "Cc : formateur@tutovisuel.com\n";
$entetes .= "Bcc : impots@tutovisuel.com\n";
// priorité urgente
$entetes .= "X-Priority : 1\n";
mail($destinataires, $sujet, "Le message\nligne2", $entetes);
?>
Type de contenu et encodage
Le paramètre Content-Type spécifie le contenu du message. Par défaut, sa valeur est text/plain. Il s’agit du texte pur sans mise en forme. Les autres principaux types sont :
- image/jpeg, image/gif, image/png : formats d’images jpg, png et gif
- text/html : message au format HTML
- application/octet-stream : flux binaire opaque, valeur non textuel, inconnu
On peut aussi définir le jeu de caractères utilisé avec la directive charset qui s’ajoute à Content-Type séparé du reste par un point-virgule. Sa valeur peut être iso-88559-1 ou en utf-8.
<?php
$destinataires = "webmaster@tutovisuel.com, dupond@tutovisuel.com";
$sujet = "Bienvenue sur Tutovisuel";
// en-têtes expéditeur
$entetes = "From : expediteur@gmail.com\n";
// en-têtes adresse de retour
$entetes .= "Reply-to : webmaster@tutovisuel.com\n";
// personnes en copie
$entetes .= "Cc : formateur@tutovisuel.com\n";
$entetes .= "Bcc : impots@tutovisuel.com\n";
// priorité urgente
$entetes .= "X-Priority : 1\n";
// type de contenu et encodage
$entetes .= "Content-type: text/plain; charset=utf-8\n";
mail($destinataires, $sujet, "Le message\nligne2", $entetes);
?>
Code de transportage
Pour lever les limites du protocole SMTP (messages limités à des données 7 bits, lignes limitées à 1000 caractères), vous pouvez utiliser la directive Content-Transfer-Encoding. Le message est codé lors de l’envoi, transféré, puis décodé par le client à la lecture. Le mécanisme est transparent pour l’utilisateur.
<?php
$destinataires = "webmaster@tutovisuel.com, dupond@tutovisuel.com";
$sujet = "Bienvenue sur Tutovisuel";
// en-têtes expéditeur
$entetes = "From : expediteur@gmail.com\n";
// en-têtes adresse de retour
$entetes .= "Reply-to : webmaster@tutovisuel.com\n";
// personnes en copie
$entetes .= "Cc : formateur@tutovisuel.com\n";
$entetes .= "Bcc : impots@tutovisuel.com\n";
// priorité urgente
$entetes .= "X-Priority : 1\n";
// type de contenu et encodage
$entetes .= "Content-type: text/plain; charset=utf-8\n";
// code de transportage
$entetes .= "Content-Transfer-Encoding: 8bit\n";
mail($destinataires, $sujet, "Le message\nligne2", $entetes);
?>
Version MINE
La directive MINE-Version permet d’identifier la version MINE du navigateur. Sa valeur est en version 1.0.
Cette directive doit être placée avant tous les autres.
<?php
$destinataires = "webmaster@tutovisuel.com, dupond@tutovisuel.com";
$sujet = "Bienvenue sur Tutovisuel";
// Version MINE
$entetes = "MIME-Version: 1.0\n";
// en-têtes expéditeur
$entetes .= "From : expediteur@gmail.com\n";
// en-têtes adresse de retour
$entetes .= "Reply-to : webmaster@tutovisuel.com\n";
// personnes en copie
$entetes .= "Cc : formateur@tutovisuel.com\n";
$entetes .= "Bcc : impots@tutovisuel.com\n";
// priorité urgente
$entetes .= "X-Priority : 1\n";
// type de contenu et encodage
$entetes .= "Content-type: text/plain; charset=utf-8\n";
// code de transportage
$entetes .= "Content-Transfer-Encoding: 8bit\n";
mail($destinataires, $sujet, "Le message\nligne2", $entetes);
?>
Email au format HTML
Pour envoyer un email au format HTML il faut donner la valeur text/html à la directive Content-Type.
Si le message contient des images, elles doivent avoir des références absolues, hébergées sur le web.
<?php
$destinataires = "webmaster@tutovisuel.com, dupond@tutovisuel.com";
$sujet = "Bienvenue sur Tutovisuel";
// Version MINE
$entetes = "MIME-Version: 1.0\n";
// en-têtes expéditeur
$entetes .= "From : expediteur@gmail.com\n";
// en-têtes adresse de retour
$entetes .= "Reply-to : webmaster@tutovisuel.com\n";
// personnes en copie
$entetes .= "Cc : formateur@tutovisuel.com\n";
$entetes .= "Bcc : impots@tutovisuel.com\n";
// priorité urgente
$entetes .= "X-Priority : 1\n";
// type de contenu HTML
$entetes .= "Content-type: text/html; charset=utf-8\n";
// code de transportage
$entetes .= "Content-Transfer-Encoding: 8bit\n";
// message HTML
$message = '<h1> Titre </h1> <p> paragraphe contenant
une image : <img src="https://tutowebdesign.com/images/image.jpg" alt="" /> </p>'
mail($destinataires, $sujet, $message, $entetes);
?>
Si votre sujet est encodé en UTF-8, les accents risquent de ne pas s’afficher correctement sur le client de la messagerie.
Vous pouvez utiliser un schéma de codage qui vient de RFC 2047 et qui est utilisé seulement pour les en-têtes SMTP. Comme mentionné ci-dessus le schéma de codage pour le corps du message est spécifié dans le Content-Type.
Affichage
<?php
$sujet = '=?UTF-8?B?'.base64_encode($sujet).'?=';
?>
Créer un formulaire de contact
Vous souhaitez mettre en place un formulaire de contact pour permettre aux internautes de vous joindre. Voici ci-dessous un exemple de codes HTML et PHP pour un envoi d’email.
Code HTML du formulaire
<form action="" method="post">
<label for="nom"> Nom : </label>
<input type="text" placeholder="--" id="nom" name="nom">
<label for="email"> Email : </label>
<input type="text" placeholder="---@---.--" id="email" name="email">
<label for="sujet"> Sujet : </label>
<input type="text" placeholder="------" id="sujet" name="sujet">
<label for="message"> Message : </label>
<textarea id="message" name="message"></textarea>
<input type="submit" id="envoi" name="envoi" value="ok">
</form>
Le code PHP
<?php
$sujet = '=?UTF-8?B?'.base64_encode($sujet).'?=';
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .='Content-Transfer-Encoding: 8bit'."\r\n" ;
$headers .= "From: $email" . "\r\n" . "Reply-To:$email" . "\r\n";
$message = "Voici le méssage de $nom : <br> $message ";
if(!mail("webmaster@tutovisuel.com", $sujet, $message, $headers)){
echo "erreur";
}else{
header("location:confirm.php");
}
?>
Il s’agit d’un exemple simple qui ne contient pas le script nécessaire au contrôle des champs du formulaire, ni le code CSS pour la présentation du formulaire de contact.