PHP - Envoyer un mail

Noter ce cours :

Présentation

Vous vous êtes peut-être déjà demandé comment un site faisait pour vous envoyer un mail directement après votre inscription ou encore selon des paramètres que vous avez renseignés. La réponse tient à peu de choses : l'envoi de mails via PHP. Il existe différents moyens pour envoyer un mail en PHP, le plus simple étant d'utiliser la fonction prévue à cet effet, à savoir la fonction mail().

La fonction mail() s'utilise de cette façon :

<?php
     mail
('email_destinataire''sujet''message');
?>

Envoi de mails au format texte

Les mails au format texte sont les mails les plus simples à envoyer. Ils ne possèdent pas de mise en forme (ni images, ni police spéciale, ni gras, etc ...) et sont de nos jours de moins en moins utilisés. Leur avantage principal est qu'ils sont lisibles par tous et qu'ils sont plus légers que leurs homologues (X)HTML, ce qui est idéal pour les serveurs et les petites connexions.

La syntaxe à utiliser pour la fonction mail() est donc identique à celle que nous avons décrite plus haut. 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.

<?php
     mail('email_destinataire', 'sujet', 'message');
?>

Les en-têtes (headers)

Les en-têtes sont utilisés dès que vous aurez envie de personnaliser un peu votre mail. Spécifier une adresse de réponse, plusieurs adresses d'envoi, des copies cachées, etc ... sont des choses impossibles sans utiliser d'en-têtes avec PHP. Voici la liste des principaux en-têtes (headers) :

La fonction mail() prend maintenant un autre argument en paramètre, à savoir les headers que vous aurez tous séparés par des \n. Voici ce que ça peut donner :

<?php
     $headers 
='From: "nom"<adresse@fai.fr>'."\n";
     
$headers .='Reply-To: adresse_de_reponse@fai.fr'."\n";
     
$headers .='Content-Type: text/plain; charset="iso-8859-1"'."\n";
     
$headers .='Content-Transfer-Encoding: 8bit';

     if(
mail('adresse_du_destinataire@fai.fr''Sujet''Message de test'$headers))
     {
          echo 
'Le message a bien été envoyé';
     }
     else
     {
          echo 
'Le message n\'a pu être envoyé';
     }
?>

Bon, vous allez voir que maintenant envoyer un mail au format HTML n'est plus si compliqué.

Envoi de mails en HTML avec PHP

Il nous faut juste 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. Rien de bien sorcier, voici ce que ça donne en pratique :

<?php
     $headers 
='From: "nom"<adresse@fai.fr>'."\n";
     
$headers .='Reply-To: adresse_de_reponse@fai.fr'."\n";
     
$headers .='Content-Type: text/html; charset="iso-8859-1"'."\n";
     
$headers .='Content-Transfer-Encoding: 8bit';

     
$message ='<html><head><title>Un titre ici</title></head><body>Un message de test</body></html>';

     if(
mail('adresse_du_destinataire@fai.fr''Sujet'$message$headers))
     {
          echo 
'Le message a été envoyé';
     }
     else
     {
          echo 
'Le message n\'a pu être envoyé';
     }
?>

Envoyer des mails 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 :

<?php
     
//-----------------------------------------------
     //DECLARE LES VARIABLES
     //-----------------------------------------------

     $destinataire='mail_destinataire@fai.fr';
     
$email_expediteur='votre_mail@fai.fr';
     
$email_reply='email_de_reponse@fai.fr';

     
$message_texte='Bonjour,'."\n\n".'Voici un message au format texte'
     
$message_html='<html>
     <head>
     <title>Titre</title>
     </head>
     <body>Test de message</body>
     </html>'
;

     
//-----------------------------------------------
     //GENERE LA FRONTIERE DU MAIL ENTRE TEXTE ET HTML
     //-----------------------------------------------

     
$frontiere '-----=' md5(uniqid(mt_rand()));

     
//-----------------------------------------------
     //HEADERS DU MAIL
     //-----------------------------------------------

     
$headers 'From: "Nom" <'.$email_expediteur.'>'."\n";
     
$headers .= 'Return-Path: <'.$email_reply.'>'."\n";
     
$headers .= 'MIME-Version: 1.0'."\n";
     
$headers .= 'Content-Type: multipart/alternative; boundary="'.$frontiere.'"';

     
//-----------------------------------------------
     //MESSAGE TEXTE
     //-----------------------------------------------
     
$message 'This is a multi-part message in MIME format.'."\n\n";

     
$message .= '--'.$frontiere."\n";
     
$message .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n";
     
$message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
     
$message .= $message_texte."\n\n";

     
//-----------------------------------------------
     //MESSAGE HTML
     //-----------------------------------------------
     
$message .= '--'.$frontiere."\n";
     
$message .= 'Content-Type: text/html; charset="iso-8859-1"'."\n";
     
$message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
     
$message .= $message_html."\n\n";

     
$message .= '--'.$frontiere."\n";

     if(
mail($destinataire,$sujet,$message,$headers))
     {
          echo 
'Le mail a été envoyé';
     }
     else
     {
          echo 
'Le mail n\'a pu être envoyé';
     }
?>

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). Le code est ensuite prêt.

Envoyer des mails avec pièces jointes

Les frontières (boundary) dans les mails permettent d'envoyer aussi des pièces jointes. On encodera les pièces jointes en Base 64 à l'aide de la fonction PHP base64_encode(). Voici un exemple :

<?php
     
//-----------------------------------------------
     //DECLARE LES VARIABLES
     //-----------------------------------------------

     
$email_expediteur='votre_mail@fai.fr';
     
$email_reply='email_de_reponse@fai.fr';
     
$message_texte='Bonjour,'."\n\n".'Voici un message au format texte';

     
$message_html='<html>
     <head>
     <title>Titre</title>
     </head>
     <body>Test de message</body>
     </html>'
;

     
//-----------------------------------------------
     //GENERE LA FRONTIERE DU MAIL ENTRE TEXTE ET HTML
     //-----------------------------------------------

     
$frontiere '-----=' md5(uniqid(mt_rand()));

     
//-----------------------------------------------
     //HEADERS DU MAIL
     //-----------------------------------------------

     
$headers 'From: "Nom" <'.$email_expediteur.'>'."\n";
     
$headers .= 'Return-Path: <'.$email_reply.'>'."\n";
     
$headers .= 'MIME-Version: 1.0'."\n";
     
$headers .= 'Content-Type: multipart/mixed; boundary="'.$frontiere.'"';

     
//-----------------------------------------------
     //MESSAGE TEXTE
     //-----------------------------------------------
     
$message 'This is a multi-part message in MIME format.'."\n\n";

     
$message .= '--'.$frontiere."\n";
     
$message .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n";
     
$message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
     
$message .= $message_texte."\n\n";

     
//-----------------------------------------------
     //MESSAGE HTML
     //-----------------------------------------------
     
$message .= '--'.$frontiere."\n";

     
$message .= 'Content-Type: text/html; charset="iso-8859-1"'."\n";
     
$message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
     
$message .= $message_html."\n\n";

     
$message .= '--'.$frontiere."\n";

     
//-----------------------------------------------
     //PIECE JOINTE
     //-----------------------------------------------

     
$message .= 'Content-Type: image/jpeg; name="nom_du_fichier.jpg"'."\n";
     
$message .= 'Content-Transfer-Encoding: base64'."\n";
     
$message .= 'Content-Disposition:attachement; filename="nom_du_fichier.jpg"'."\n\n";

     
$message .= chunk_split(base64_encode(file_get_contents('nom_du_fichier.jpg')))."\n";

     if(
mail($destinataire,$sujet,$message,$headers))
     {
          echo 
'Le mail a été envoyé';
     }
     else
     {
          echo 
'Le mail n\'a pu être envoyé';
     }
?>

Chapitre suivant

POO - programmation orientée objet

Vous avez aimé cet article intitulé PHP - Envoyer un mail ? Partagez-le !
Vulgarisation-informatique.com
Cours en informatique & tutoriels