L'envoit d'e-mail avec PHP c'est simple comme PHPMailer
Voyant beaucoup de personnes rencontrer des problèmes pour l'envoi d'e-mail en PHP, je vous propose dans cet article de découvrir la classe PHPMailler rendant la tâche beaucoup plus simple. Bien sur, envoyer un simple e-mail au format texte n'a rien de compliqué. Toutefois, lorsqu'il s'agit de l'envoyer au format HTML, ou encore d'y joindre un fichier, certains si perdent. PHPMailer apporte une solution simple et efficace.
Pour commencer
Avant toute chose, vous allez devoir télécharger PHPMailer. Une fois l'archive décompressée, vous trouverez plusieurs fichiers dont class.phpmailer.php. C'est celui-ci qui nous intéressera. Il contient toute la définition de la classe PHPMailer. Tout code faisant appel à cette classe devra donc commencer par les instructions suivantes :
<?php require('class.phpmailer.php'); ?>
Un premier mail
Nous allons tenter d'envoyer un premier e-mail grâce à cette classe. Vous allez tout de suite comprendre à quel point il est simple de l'utiliser.
<?php // On va chercher la définition de la classe require('class.phpmailer.php'); // On créé une nouvelle instance de la classe $mail = new PHPMailer(); // De qui vient le message, e-mail puis nom $mail->From = "moi@vous.la"; $mail->FromName = "Nom Prénom"; // Définition du sujet/objet $mail->Subject = "Un mail envoyé avec PHPMailer!"; // On définit le corps du message $mail->Body = "Bonjour!"; // Il reste encore à ajouter au moins un destinataire // (ou plus, par plusieurs appel à cette méthode) $mail->AddAddress("hey@ho.com", "HeyHo"); // Pour finir, on envoi l'e-mail $mail->send(); ?>
Dans cette exemple, nous avons envoyé un message simple en format texte. Comme vous pouvez le voir, l'envoi est tout de suite plus clair. Il n'est pas nécessaire de créer les entêtes du message. De plus, les noms d'attributs et méthodes sont très clairs.
Un mail au format HTML
On va maintenant voir à quel point cette classe est intéressante. Avec un exemple d'envoi d'e-mail au format HTML. Là encore, rien de bien compliqué, et c'est justement tout l'intérêt de cette classe!
<?php // On va chercher la définition de la classe require('class.phpmailer.php'); // On créé une nouvelle instance de la classe $mail = new PHPMailer(); // De qui vient le message, e-mail puis nom $mail->From = "moi@vous.la"; $mail->FromName = "Nom Prénom"; // Définition du sujet/objet $mail->Subject = "Un mail envoyé avec PHPMailer!"; // On lit le contenu d'une page html $body = file_get_contents('page_mail.html'); // On définit le contenu de cette page comme message $mail->MsgHTML($body); // On pourra définir un message alternatif pour les boîtes de // messagerie n'acceptant pas le html $mail->AltBody = "Ce message est au format HTML, votre messagerie n'accepte pas ce format."; // Il reste encore à ajouter au moins un destinataire $mail->AddAddress("hey@ho.com", "HeyHo"); // Pour finir, on envoi l'e-mail $mail->send(); ?>
Notez qu'on ne se pose toujours pas la question de la formation des entêtes. On pourra tout de même se poser la question du jeu de caractères (charset). Par défaut, il est définit à ISO-8859-1. Mais il est tout à fait possible de le changer avec l'instruction suivante :
<?php // Pour le passer en UTF-8 par exemple : $mail->CharSet = 'UTF-8'; ?>
Un mail avec pièce jointe
Voilà une question très fréquente dans les forums de programmation PHP, comment envoyer un e-mail avec une pièce jointe? PHPMailer propose là encore une solution simple et efficace. Imaginons que l'on souhaite envoyer notre CV par e-mail :
<?php // On va chercher la définition de la classe require('class.phpmailer.php'); // On créé une nouvelle instance de la classe $mail = new PHPMailer(); // De qui vient le message, e-mail puis nom $mail->From = "moi@vous.la"; $mail->FromName = "Nom Prénom"; // Définition du sujet/objet $mail->Subject = "Un mail envoyé avec PHPMailer!"; // On définit le corps du message $mail->Body = "Bonjour! Veuillez trouver ci-joint mon CV. Cordialement, Machin truc."; // Il reste encore à ajouter au moins un destinataire $mail->AddAddress("recrutement@ho.com", "HeyHo"); // On met notre CV en pièce jointe $mail->AddAttachment('./CV.pdf'); // Pour finir, on envoi l'e-mail $mail->send(); ?>
Vous remarquerez encore une fois que l'envoi de pièce jointe est considérablement simplifié en utilisant PHPMailer.
Le mot de la fin
Pour aller plus loin, rien de mieux que de vous rendre sur le site officiel de PHPMailer, en anglais. Vous y trouverez une documentation très complète sur l'utilisation de cette classe et les différentes possibilités qui vous sont offertes.
Ce qui est certain, c'est qu'il ne faut pas se priver de l'utiliser. Vous gagnerez du temps dans vos développements.


yo thierryyyyy
jeje | lundi 5 janvier 2009 | 16:09yo thierryyyyy
Moi, ça ne marche pas, dommage ça a l'air si
bertrand | mercredi 4 février 2009 | 08:28Moi, ça ne marche pas, dommage ça a l'air si simple... Le résultat que j'obtiens affiche purement et simplement le script php et n'envoie aucun mail...
Peut-être celà vient-il d'un mauvais téléchargement ou mauvais dézippage de phpmailer ?
Si vous avez une idée...
PHP est-il bien installé et fonctionnel ? Un
Thierry | mercredi 4 février 2009 | 14:09PHP est-il bien installé et fonctionnel ?
Un exemple simple à tester pour en être sûr :
<? echo "Ca marche"; ?>
dans un fichier test.php.
hello, saurais-tu comment faire pour envoyer des
nik0 | vendredi 20 mars 2009 | 11:37hello,
saurais-tu comment faire pour envoyer des caractères utf-8 dans le sujet ?
je n'y arrive pas...
merci
En principe, pas de soucis pour un sujet en UTF-8.
Thierry | vendredi 20 mars 2009 | 11:42En principe, pas de soucis pour un sujet en UTF-8. D'ailleurs il me semble que si le message est en UTF8, tout le contenu du mail, objet inclue, est en UTF-8.
Le problème peut venir de la page qui liste les message, si elle n'est pas en UTF8 elle aussi ça peut poser des problème pour lister les sujet des message si aucune conversion n'est faite.
Bonjour, Une petite question est ce que le From
cloud27 | mercredi 20 mai 2009 | 15:07Bonjour,
Une petite question est ce que le From est obligatoire?
Car je souhaiterais juste insérer le FromName sans donner d'adresse mail mais j'ai bien l'impression que si je ne la donne pas il n'affiche pas le FromName...
Merci
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrfffffffffffffffffffff
reda | vendredi 30 octobre 2009 | 10:30rrrrrrrrrrrrrrrrrrrrrrrrrrrrrffffffffffffffffffffff
hbffffffffffffffg
Super le tuto, j'utilise phpmailer. J'arrive à
tony974 | dimanche 21 mars 2010 | 07:24Super le tuto, j'utilise phpmailer.
J'arrive à envoyer mes mails en html avec une image en pièce jointe
mais je ne sais pas comment intégrer mon image dans le corps du mail.
Je sais qu'il faut lui mettre un ID mais comment ? et comment l'appeler ensuite ?
Merci
Bonjour, J'ai utilisé ce tuto pour gérer l'envoi
Claire | mercredi 19 mai 2010 | 16:42Bonjour,
J'ai utilisé ce tuto pour gérer l'envoi d'un mail à administrateur d'un site d'annonces en lignes après qu'un internaute ait validé un formulaire. Toutes les données sont bien envoyées dans le mail mais je ne parviens pas à envoyer les fichiers joints. En fait il s'agit de fichiers que l'internaute choisi grace à <input type="file">. Comment est ce que je peux faire pour envoyer ces fichiers joints sur le mail de l'administrateur?
Merci,
Claire
En l'absence de code, il est assez difficile de
Thierry Geindre | mercredi 19 mai 2010 | 16:49En l'absence de code, il est assez difficile de comprendre la source du problème. Il y a cependant plusieurs pistes à explorer :
- La plus simple : certain services de messagerie gratuit limitent la taille des pièces jointes. Essayer donc avec des pièces jointes plus petites.
- Essayer avec des fichiers non uploadé, donc avec des fichiers déjà présents sur le serveur. Si cela fonctionne, c'est que le problème réside dans l'upload et non pas dans l'envois du mail.
Merci pour cette réponse rapide. En effet, j'ai
Claire | mercredi 19 mai 2010 | 17:15Merci pour cette réponse rapide. En effet, j'ai essayé avec une image présente sur mon ordinateur et cela fonctionne.
Pour l'envoi d'un fichier choisi par l'internaute via le formulaire voici mon code :
$chemin_destination = 'tmp/';
move_uploaded_file($_FILES['photosbien']['tmp_name'], $chemin_destination.$_FILES['photosbien']['name']);
require "../../../../phpmailer/class.phpmailer.php";
$mail = new PHPmailer();
$mail->From='xxxxxx';
$mail->AddAddress('xxxxxxx');
$mail->Subject="xxxxxxx";
$mail->Body="Bonjour!";
$mail->AddAttachment("tmp/".$_FILES['photosbien']['name']);
if(!$mail->Send()){ echo $mail->ErrorInfo; }
else { echo "OK"; }
unset($mail);
Il faut préciser que je travaille pour le moment en local avant de mettre mes fichiers sur le serveur.
Le problème vient donc bien de l'upload. Vérifiez
Thierry Geindre | mercredi 19 mai 2010 | 17:30Le problème vient donc bien de l'upload. Vérifiez que le fichier uploadé est bien présent (file_exists) et qu'il est accessible en lecture (is_readable).
En principe, le fait de travailler localement ne change rien. Cela-dit, il faut aussi prendre en compte le fait que certains FAI mettent en place des restrictions sur les mail sortant. Mais je ne pense pas que le problème vienne de là.
Alors, L'upload s'effectue bien, c'est à dire que
Claire | mercredi 19 mai 2010 | 17:38Alors,
L'upload s'effectue bien, c'est à dire que le fichier s'enregistre bien dans le dossier demandé : tmp/ nom_de_mon_fichier.
Mais apparemment quand je demande à aller le rechercher il ne trouve pas le dossier. Le message d'erreur qu'il me renvoie est le suivant :
Language string failed to load: file_access tmp/
(tmp est le nom du dossier dans lequel je lui demande d'aller récupérer le fichier).
Pour ce qui est du travail en local à quoi correspond FAI?
De manière générale, il n'est pas recommandé de
Thierry Geindre | mercredi 19 mai 2010 | 17:45De manière générale, il n'est pas recommandé de travailler avec des chemins relatifs. Vous pouvez par exemple utiliser le code suivant :
$fichier = dirname(__FILE__).'/'.$chemin_destination.$_FILES['photosbien']['name'];
Et vous pourrez ensuite utiliser la variable fichier dans les fonctions move_uploaded_file() et AddAttachment().
(FAI : Fournisseur d'Acces à Internet)
J'ai fait plusieurs essais avec le code que vous
Claire | mercredi 19 mai 2010 | 18:15J'ai fait plusieurs essais avec le code que vous m'avez proposé mais le fichier n'est plus uploadé. J'ai écrit l'upload de cette façon :
move_uploaded_file($fichier) et la variable $fichier de cette façon
$fichier = dirname(__FILE__).'/'.$chemin_destination.$_FILES['photosbien']['name'][$i]; (le $i c'est parce que j'ai plusieurs images et je les vérifie à l'aide d'une boucle).
Bjr j'ai aimé votre tuto SVP je suis nouveau avec
wicem | vendredi 9 juillet 2010 | 14:17Bjr
j'ai aimé votre tuto
SVP je suis nouveau avec php
j'ai utilisé ce script et ca marche bien mais je voulais savoir si j'ai 2 ou 3 destinataires a qui envoyer le mail comment dois je faire ?
je met :
$mail->AddAddress("$dest");
avec $dest=" toto@mail.fr ; titou@tmail.fr);
la même question pour rajouter des Bcc
merci
Il suffit de répéter la ligne.
Thierry Geindre | vendredi 9 juillet 2010 | 14:20Il suffit de répéter la ligne.
$mail->AddAddress("un@lala.com");
$mail->AddAddress("deux@lala.com");
$mail->AddAddress("trois@lala.com");
Et ainsi de suite, autant de fois que nécessaire.
Merci je vais essayer ca !! Mais j'aimerais bien
wicem | vendredi 9 juillet 2010 | 14:35Merci je vais essayer ca !!
Mais j'aimerais bien savoir comment faire avec une variable parce-que les destinataires varient chaque fois selon ce que l'utilisateur va choisir la liste des personnes a qui envoyer le message ..
Dans ce cas, il faudrait voir le reste du code de
Thierry Geindre | vendredi 9 juillet 2010 | 14:52Dans ce cas, il faudrait voir le reste du code de vos pages. Et ce n'est pas l'endroit approprié pour ce genre conversation. Je vous invite à vous rendre sur un forum traitant du sujet.
Bjr, Dans ta variable body tu fais un
kakashi zorro | mercredi 27 octobre 2010 | 04:24Bjr,
Dans ta variable body tu fais un file_get_contents(ma_page.html). Peut on plutôt mettre une page php? c'est à dire une page qui contient un code dynamique, exemple une lecture dans la bd pour afficher une valeur précise?
$body = file_get_contents('page_mail.php');
Bjr, à la place j'ai fait $body = "...mon code
kakashi zorro | mercredi 27 octobre 2010 | 05:10Bjr, à la place j'ai fait $body = "...mon code php..." et ca marche meme si la page est un peu longue.
Merci pour le tutoriel, tu m'as fait gagner 2 semaines de recherches infructueuses!!!
Hey! Your blog is totally awesome, I enjoy reading
seo tools | vendredi 29 juillet 2011 | 22:00Hey! Your blog is totally awesome, I enjoy reading it since I founded it in google on the first place. But why you are so deep for other search queries? It’s really unfair. I recommend you to use ProChecker to improve your Google rankings (you can explore more about it clicking on the link in the URL field - it’s not a spam, of course, just a friendly advice). Please Keep writing! Best regards, Steve.