02 déc. 2008
Envoyer des emails de type texte et HTML avec pièces jointes en PHP
19:13
Jean-Christophe Duvivier
HTML
Mail
PHP
Le but de ce tuto est de vous donner toutes les cartes afin que vous puissiez envoyer des emails de type "texte" ou "HTML" via PHP. Il ne se veut pas exhaustif, mais suffisamment complet pour répondre à la demande d'au moins 90% d'entre vous. J'estime que seules les personnes expérimentées auront besoin de créer des applications plus complexes (je généralise, mais c'est majoritairement le cas).
Ce tuto se veut succin mais pertinent. J'irai droit au but. L'envoi de Mail requiert la connaissance de paramètres, d'une syntaxe particulière... Soit vous l'apprenez par cœur, soit vous mettez ce tuto en marque page, il se révélera très pratique ;) Trêve de blabla. On y va.
1. Envoi de mail texte
L'envoi de mail se fait grâce à la fonction mail(). Elle prend au minimum 3 paramètres : le destinataire, le sujet et le message.
<?php /*---- Déclaration des paramètres ----*/ $destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule $sujet = "Tuto - Envoi de mail"; /*---- Déclaration du message ----*/ $message = "Mon Message"; /*---- Envoi du mail ----*/ mail($destinataire, $sujet, $message); ?>
Grâce à un 4ème paramètre (optionnel), l'entête, il vous est possible de renseigner davantage d'informations, tels que l'adresse email de l'expéditeur, ou encore la priorité du mail.
<?php /*---- Déclaration des paramètres ----*/ $destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule $expediteur = "contact@jchristophe.fr"; $sujet = "Tuto envoi de mail"; /*---- Déclaration de l'entête ----*/ $entete = "From: $expediteur \n"; // Adresse de l'expéditeur $entete .= "Reply-to: $expediteur \n"; // Adresse de réponse $entete .= "Cc: destinataire1@gmail.com \n"; // Destinataire(s) en copie cachée $entete .= "Bcc: destinataire2@gmail.com \n"; // Destinataire(s) en mode caché $entete .= "X-Priority: 1 \n"; // Priorité du mail. 5 = basse, 3 = normal, 1 = urgent /*---- Déclaration du message ----*/ $message = "Mon Message"; // Pour sauter une ligne, écrire : \n /*---- Envoi du mail ----*/ mail($destinataire, $sujet, $message, $entete); ?>
2. Envoi de mail html
Pour envoyer un mail au format HTML, il suffit de déclarer le Content-Type du mail dans son entête. Vous pourrez ensuite utiliser toutes vos balises HTML dans votre message.
<?php /*---- Déclaration des paramètres ----*/ $destinataire = "destinataire@gmail.com"; // Pour plusieurs destinataires, les séparer par une virgule $expediteur = "contact@jchristophe.fr"; $sujet = "Tuto envoi de mail"; /*---- Déclaration de l'entête ----*/ $entete = "From: $expediteur \n"; // Adresse de l'expéditeur $entete .= "Reply-to: $expediteur \n"; // Adresse de réponse $entete .= "Cc: destinataire1@gmail.com \n"; // Destinataire(s) en copie cachée $entete .= "Bcc: destinataire2@gmail.com \n"; // Destinataire(s) en mode caché $entete .= "X-Priority: 1 \n"; // Priorité du mail. 5 = basse, 3 = normal, 1 = urgent $entete .= "Content-Type: text/html \n"; // Type du mail : HTML /*---- Déclaration du message ----*/ $message = "<html><body>"; $message .= "<strong>Mon Texte Gras</strong><br />"; $message .= "<font color=\'#ff0000\'>Mon Texte Rouge</font>"; $message .= "</body></html>", /*---- Envoi du mail ----*/ mail($destinataire, $sujet, $message, $entete); ?>
Concernant l'affichage des images, n'oubliez pas de renseigner l'url complète de votre image, que vous avez, au préalable, hébergé sur un serveur ;)
3. Envoi de mail avec pièce(s) jointe(s)
<?php /*---- Déclaration des paramètres ----*/ $destinataire = "contact@jchristophe.fr"; // Pour plusieurs destinataires, les séparer par une virgule $expediteur = "contact@jchristophe.fr"; $sujet = "Tuto envoi de mail"; $delimiteur = md5(uniqid(rand())); // Création d'un numéro unique, qui délimitera les différents blocs du mail $piecejointe = "candidat.pdf"; // Déclaration du fichier à envoyer en tant que pièce jointe $contenupiecejointe = file_get_contents($piecejointe); // Récupération du contenu du fichier $contenupiecejointe = chunk_split(base64_encode($contenupiecejointe)); // Conversion du fichier : respect du format RFC 2045 $typepiecejointe = filetype($piecejointe); // Récupération du type du fichier /*---- Déclaration de l'entête ----*/ $entete = "From: $expediteur \n"; $entete .= "Reply-to: $expediteur \n"; $entete .= "Cc: destinataire1@gmail.com \n"; $entete .= "Bcc: destinataire2@gmail.com \n"; $entete .= "X-Priority: 1 \n"; $entete .= "MIME-Version: 1.0 \n"; $entete .= "Content-Type: multipart/mixed; boundary=\"$delimiteur\" \n"; // Déclaration du type du mail et du délimiteur $entete .= " \n"; /*---- Déclaration du message ----*/ $message = "--$delimiteur \n"; // Séparation du bloc "entete" et du bloc "message" par notre délimiteur $message .= "Content-Type: text/html; charset=\"iso-8859-1\" \n"; // Déclaration du type du message ainsi que la charte de codage $message .= "Content-Transfer-Encoding:8bit\n"; // Déclaration du type de codage $message .= "\n"; $message .= "<strong>Mon Texte Gras</strong><br />"; $message .= "<font color=\"#ff0000\">Mon Texte Rouge</font>"; $message .= "\n"; /*---- Insertion de la pièce jointe ----*/ $message .= "--$delimiteur \n"; // Séparation du bloc "message" et du bloc "pièce jointe" par notre délimiteur $message .= "Content-Type: $typepiecejointe; name=\"$piecejointe\" \n"; // Déclaration du type et du nom de la pièce jointe $message .= "Content-Transfer-Encoding: base64 \n"; // Déclaration du type de codage $message .= "Content-Disposition: attachment; filename=\"$piecejointe\" \n"; // attachment = pièce jointe = fichier à sauvegarder $message .= "\n"; $message .= $contenupiecejointe." \n"; // Insertion du fichier $message .= "\n"; $message .= "--$delimiteur"; // Délimitation de la fin de la pièce jointe, et du mail /*---- Envoi du mail ----*/ mail($destinataire, $sujet, $message, $entete); ?>
Et voilà ! Je pense avoir été assez précis, explicite et pertinent. Cependant, si vous avez des questions sur des éléments relatifs à l'envoi de mail en PHP présents, ou pas, dans ce tuto, je me ferai un plaisir de répondre dans la limite de mes compétences ;)
N'hésitez pas à réagir ;)
Sapin de Noël en place




novembre 2011
Commentaires
Le 17 fév. 2009 à 11:28
bonjour,
j'ai un question. J'ai un formaulaire html standard et je veu lui ajouter l'insertions de piece jointe.
j'ai donc ajouté a mon formulaire le champ <input type="file" name="photo"/>.
pour ma page de traitement php je bloc et meme avec votre explication.
comment dois-j'ai traité mon fichier validation.php afin de recevoir les photos ou peices jointe directement par mail sans passé par une BDD?
Le 17 fév. 2009 à 20:51
Salut
Le passage par une BDD n'est pas obligatoire, par contre ton fichier doit être "transféré" sur ton serveur avant l'envoi. Ensuite, il faut renseigner le chemin de ton fichier dans la variable $piecejointe ;)
En combinant ce tuto d'upload de fichier :
http://www.siteduzero.com/tutoriel-...
Et mon tuto d'envoi de mails, tu devrais t'en sortir ;)
Le 22 fév. 2009 à 21:05
Merci.
J'ai passé tout mon dimanche sur l'envoi de fichier joint par php. J'ai consulté des dizaines de sites et ça ne marchait pas.
Et puis votre site est venu me sauver de ma dépression naissante.
Ouf ma journée est sauvée.
Le 24 fév. 2009 à 19:21
C'est le genre de commentaire qui fait plaisir ^^
Merci pour ton passage ici, et content d'avoir pu t'aider ;)
a+
Le 21 avr. 2009 à 20:17
Article très clair qui m'a fait économiser pas mal de temps, merci !
Le 23 avr. 2009 à 18:41
Re, tout marche presque nickel, sauf pour les pièces jointes (j'ai testé chez hotmail sur des fichiers .zip).
Je reçois les fichiers corrompus, un fichier de 300K par exemple a une nouvelle taille de 400K, et impossible de les ouvrir.
Merci.
Le 26 avr. 2009 à 11:47
Salut !
C'est bizarre que ça foire... Je viens de tester avec un ZIP de 1.17Mo et tout fonctionne impec ! Y'a pas un problème à la base avec ton archive ?
Le 26 avr. 2009 à 23:24
Désolé, je viens de passer 2 journées à trouver la solution : "transfert-encoding" au lieu de "transfer-encoding" -_-' faudrait que je pense à dormir un peu.
En tout cas je le redis excellent article !
Le 27 avr. 2009 à 18:11
Aïe, au moins tu te tromperas plus maintenant ^^ Content que t'ai localisé et résolu le problème ;)
Merci pour le com' ;)
Le 29 mai 2009 à 09:55
bonjour
Très bien et très clair pour ma part
une p'tite question : quand j'envoie un fichier joint, j'ai en plus un fichier ATT00...txt. peux -t-on le supprimer ?
Le 22 juil. 2009 à 01:40
Merci, simple et efficace
Juste ce qu'il me fallait !
Le 17 août 2009 à 20:21
Clair, net et précis !
Merci beaucoup et bonne continuation !
Le 21 sept. 2009 à 01:56
tout le monde doit lire ca pour comprendre!!
Le 25 sept. 2009 à 13:18
En réponse à PAkal à propos de la pièce jointes ATT00xxx.txt qui est ajoutée au mail.
J'ai eu le même problème et pour le résoudre il faut rajouter "--\n" après le délimiteur final :
$message .= "--$delimiteur--\n"; // Délimitation de la fin de la pièce jointe, et du mail
Le 13 avr. 2010 à 17:03
bonjour,
je me suis inspirée de ton code pour complèter le mien mais l'envoi de la pièce jointe ne fonctionne pas :( pourrais tu m'aider s'il te plait ? voici mon code
// Etape pour que l'inscrit reçoive un mail de confirmation
$delimiteur = md5(uniqid(rand())); // Création d'un numéro unique, qui délimitera les différents blocs du mail
$piecejointe = "Invitation_PREVIRISQ.pdf"; // Déclaration du fichier à envoyer en tant que pièce jointe
$contenupiecejointe = file_get_contents($piecejointe); // Récupération du contenu du fichier
$contenupiecejointe = chunk_split(base64_encode($contenupiecejointe)); // Conversion du fichier : respect du format RFC 2045
$typepiecejointe = filetype($piecejointe); // Récupération du type du fichier
$entete_2.= "X-Priority: 1 \n";
$entete_2.= "MIME-Version: 1.0 \n";
$entete_2.= "Content-Type: multipart/mixed; boundary=\"$delimiteur\" \n"; // Déclaration du type du mail et du délimiteur
$entete_2.= " \n";
$message_envoi2.= "--$delimiteur \n"; // Séparation du bloc "entete" et du bloc "message" par notre délimiteur
$message_envoi2.= "Content-Type: text/html; charset=\"iso-8859-1\" \n"; // Déclaration du type du message ainsi que la charte de codage
$message_envoi2.= "Content-Transfer-Encoding:8bit\n"; // Déclaration du type de codage
$message_envoi2="Bonjour, \n \n";
$message_envoi2.="Votre demande d'inscription en tant que visiteur libre \n";
$message_envoi2.="a bien été enregistrée. \n\n";
$message_envoi2.="Vos informations : \n";
$message_envoi2.="".$_POST["NOM"]. "\n";
$message_envoi2.="".$_POST["PRENOM"]." \n";
$message_envoi2.="".$_POST["SOCIETE"]." \n";
$message_envoi2.="".$_POST["EMAIL"]. "\n \n";
$message_envoi2.= "--$delimiteur \n"; // Séparation du bloc "message" et du bloc "pièce jointe" par notre délimiteur
$message_envoi2.= "Content-Type: $typepiecejointe; name=\"$piecejointe\" \n"; // Déclaration du type et du nom de la pièce jointe
$message_envoi2.= "Content-Transfer-Encoding: base64 \n"; // Déclaration du type de codage
$message_envoi2.= "Content-Disposition: attachment; filename=\"$piecejointe\" \n"; // attachment = pièce jointe = fichier à sauvegarder
$message_envoi2.= "\n";
$message_envoi2.= $contenupiecejointe." \n"; // Insertion du fichier
$message_envoi2.= "\n";
$message_envoi2.= "--$delimiteur"; // Délimitation de la fin de la pièce jointe, et du mail
$destinataire2=$_POST["EMAIL"];
$entete2="From: web@web.com";
mail ($destinataire2,$objet,$message_envoi2,$entete2);