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 ;)