Presentation

Vous vous etes peut-etre deja demande comment un site faisait pour vous envoyer un mail directement apres votre inscription ou encore selon des parametres que vous avez renseignes. La reponse tient a peu de choses : l'envoi de mails via PHP. Il existe differents moyens pour envoyer un mail en PHP, le plus simple etant d'utiliser la fonction prevue a cet effet, a savoir la fonction mail().

La fonction mail() s'utilise de cette facon :

<?php
     mail
('email_destinataire''sujet''message');
?>
Envoi de mails au format texte

Les mails au format texte sont les mails les plus simples a envoyer. Ils ne possedent pas de mise en forme (ni images, ni police speciale, ni gras, etc ...) et sont de nos jours de moins en moins utilises. Leur avantage principal est qu'ils sont lisibles par tous et qu'ils sont plus legers que leurs homologues (X)HTML, ce qui est ideal pour les serveurs et les petites connexions.

La syntaxe a utiliser pour la fonction mail() est donc identique a celle que nous avons decrite plus haut. Pour faire un saut de ligne dans le message, on utilise \n qui doit etre entoure de guillemets doubles et non de guillemets simples. En effet, "\n" est un seul caractere "interprete". '\n' ne fonctionnera donc pas.

<?php
     mail('email_destinataire', 'sujet', 'message');
?>
Les en-tetes (headers)

Les en-tetes sont utilises des que vous aurez envie de personnaliser un peu votre mail. Specifier une adresse de reponse, plusieurs adresses d'envoi, des copies cachees, etc ... sont des choses impossibles sans utiliser d'en-tetes avec PHP. Voici la liste des principaux en-tetes (headers) :

La fonction mail() prend maintenant un autre argument en parametre, a savoir les headers que vous aurez tous separes par des \n. Voici ce que ca 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 ete envoye';
     }
     else
     {
          echo 
'Le message n\'a pu etre envoye';
     }
?>

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

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 ca 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 ete envoye';
     }
     else
     {
          echo 
'Le message n\'a pu etre envoye';
     }
?>
Envoyer des mails au formats texte et HTML

Pour etre 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 evoluee 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 ete envoye';
     }
     else
     {
          echo 
'Le mail n\'a pu etre envoye';
     }
?>

On genere d'abord une frontiere (boundary) qui permettra au client mail de separer les differents contenus. Cette frontiere, lorsqu'elle sera utilisee, sera entouree de deux tirets accoles. Apres la frontiere, on modifie eventuellement les headers appliques localement (ici le type du message). Le code est ensuite pret.

Envoyer des mails avec pieces jointes

Les frontieres (boundary) dans les mails permettent d'envoyer aussi des pieces jointes. On encodera les pieces jointes en Base 64 a 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 ete envoye';
     }
     else
     {
          echo 
'Le mail n\'a pu etre envoye';
     }
?>
Chapitre suivant

POO - programmation orientee objet