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) :
- From : cet en-tête 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 débilités (SPAM).
On l'utilise comme ceci : From: "Nom de l'expéditeur" <adresse mail de l'expéditeur> - Reply-To : cet en-tête permet de spécifier l'adresse email de réponse.
On l'utilise comme ceci : Reply-To: adresse_mail - Cc: : cet en-tête 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: : cet en-tête 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).
- Content-Transfer-Encoding : cet en-tête 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).
- X-Priority : Permet de définir 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é.
- Disposition-Notification-To : Permet de spécifier l'adresse mail de retour pour la confirmation de lecture.
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
- Programmation orientée objet (POO)
- Présentation de la POO
- Les classes
- Notion d'objet
- Créer un objet (instanciation d'une classe)
- Constructeurs et destructeurs
- Visibilité des attributs et des méthodes
- L'héritage