Comment Envoyer des mails en PHP
mercredi 24 juin 2009 par Webman
Introduction :
Je sais que beaucoup se sont déjà posé la question à savoir comment se fait l’envoi automatique de mails à partir d’un site web (par exemple lors d’une inscription). C’est ce que je vais essayer d’expliquer dans ce tutoriel. Pour commencer, sachez que cela se fait avec PHP et qu’il existe plusieurs moyens pour envoyer un mail en PHP. Mais le plus simple et fiable est d’utiliser la fonction prédéfinie à cet effet, la fonction mail(). C’est la méthode que je vais expliquée dans ce tuto.
Nous pouvons envoyer un mail sous trois formats différents avec la fonction mail().
Nous allons étudier ces trois différents cas :
* Envoi de mails au format TEXTE
* Envoi de mails au format HTML
* Envoi de mails au format TEXTE et HTML
En fin de leçon, j’ouvrirai une petite parenthèse pour parler d’une des possibilités d’envoyer un mail avec pièce jointe.
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.
La syntaxe à utiliser pour la fonction mail() dans ce cas précis est :
<?php
mail('email_destinataire', 'sujet', 'message');
?>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.
REMARQUE : Les en-têtes (headers) de mail
En PHP, les en-têtes de mail sont utilisés pour personnaliser un peu le mail à envoyer.
Par exemple, pour spécifier une adresse de réponse, plusieurs adresses d’envoi, des copies cachées, etc ... nous devons utiliser les en-têtes de mail.
Voici la liste des principaux en-têtes (headers) de mail :
- 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"
- 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() peut alors prendre en plus un autre argument en paramètre, à savoir les headers que vous aurez décidé d’ajouter à votre mail. Et cela, en les séparant tous 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é';
}
?>Ainsi peut se faire l’envoi d’un mail au format TEXTE avec la fonction mail() de PHP.
Envoi de mails en HTML avec PHP
Le changement d’avec la première méthode n’est pas grandiose. Il nous faudra juste modifier le message pour le mettre au format HTML, et modifier le header Content-Type pour spécifier que le message doit être envoyé au format HTML.
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é';
}
?>Alors, vous avez bien vu que ce n’est pas sorcier d’envoyer un mail au format HTML si on sait déjà le faire au format TEXTE.
NB : Je signale ici que le format HTML, dans la réalité, rencontrera des problèmes de compatibilité avec certains clients mails. En effet, il en existe qui ne peuvent pas interpréter les mails au format HTML.
Pour palier à ce problème, il existe une alternative qui est une combinaison du format TEXTE et du format HTML. C’est ce dont je vais parler dans le point suivant.
Envoyer des mails au format TEXTE-HTML
Donc comme dit plus haut, ce type de format combiné permettra aux mails d’être compatibles avec tous les clients mails. 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-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.
Je vous conseille toujours cette méthode si vous ne voulez pas avoir des surprises.
PARENTHESE : Envoyer des mails avec pièces jointes
L’envoi des mails avec pièces jointes est l’une des meilleures utilisation de la fonction mail(). Vous vous demandez comment cela peut se faire ???
Vous devez savoir qu’il existe plusieurs moyens d’envoyer des mails avec fichier en PHP (même si tous utilisent la fonction mail()).
Je vous ferez remarquer que la méthode que je vais expliquer ci-après est une méthode standard qui n’est pas la meilleure, ni la plus souple des méthodes d’envoi avec pièces jointes. Il en existe de plus optimal : Si vous voulez, je revendrai sur une des autres méthodes dans un autre tutoriel.
Pour la méthode standard, cela va se faire avec la frontière BOUNDARY utilisé plus haut dans la section envoi de mail aux formats combinés (Envoyer des mails au format TEXTE-HTML).
Il faut savoir que les frontières (boundary) dans les mails permettent aussi d’envoyer 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é';
}
?>Voila, vous pouvez désormais envoyer vos mails via vos sites web. Mais n’en abusez pas. lol
Forum
© Copyright FacileDev, 2010
