
Une fonction complète d’envoi de mails en PHP
Publié le
Il existe quantité de fonctions sur le web pour envoyer des mails, mais je n’en ai trouvé aucune qui soit réellement complète et qui puisse être utilisable dans tout contexte. J’ai donc développé ma propre fonction, que j’ai eu l’occasion de tester professionnellement et qui est véritablement robuste.
Fonction d’envoi de mails
- Protection contre l’injection d’en-têtes [1]
- Possibilité d’envoi à plusieurs destinataires (Un mail par destinataire)
- Envoi du mail au format texte ou html en fonction du contenu
- Utilisation de templates texte et HTML pour l’envoi de mails au format mixte (texte/html)
- Possibilité d’ajout de pièces jointes
Utilisation
Liste des paramètres
- string $nom_from (Obligatoire) : Le nom de l’expéditeur
- string $mail_from (Obligatoire) : l’adresse e-mail de l’expéditeur
- mixed $to (Obligatoire) : une chaîne ou un array contenant les adresses des destinataires
- string $subject (Obligatoire) : le sujet du mail
- mixed $data (Obligatoire) : Une chaîne avec le contenu du mail, ou un array avec comme clés des codes de remplacement et comme valeurs les chaînes de remplacement
- string $template_html (Facultatif) : si $data est un array, contient le chemin vers le fichier de template HTML contenant les codes de remplacement sous la forme #CODE#.
- string $template_txt (Facultatif) : si $data est un array, contient le chemin vers le fichier de template texte contenant les codes de remplacement sous la forme #CODE#.
- array $pj (Facultatif) : Chaque pièce jointe doit être un array de la forme suivante :
- name : Nom du fichier
- path : chemin vers le fichier
Si $template_html et $template_txt sont tous les deux utilisés, le mail sera envoyé au format mixte text/html : la plupart des clients mails peuvent lire l’HTML, mais ceux qui ne le peuvent pas afficheront la version texte.
Exemples d’utilisation
Envoi d’un mail à une personne (email@dest) :
Envoi du même email à plusieurs personnes :
Envoi d’un email mixte :
'nom' => 'Untel',
'prenom' => 'Georges'
);
envoi_mail('Marc Brillault', 'marc@brillault.fr', 'email@dest', 'Sujet', $data, 'chemin/vers/template_html', 'chemin/vers/template_txt');
Le contenu du fichier template_html :
<p>Bonjour #PRENOM# #NOM# et merci de vous être inscrit</p>
Le contenu du fichier template_txt :
Bonjour #PRENOM# #NOM# et merci de vous être inscrit
Notes
[1] J’utilise la fonction de jatinder diffusée sur PHPSense
Thierry
bonjour,
tout fonctionne sauf la pièce jointe, je ne sais pas comment renseigner $pj avec
array(
’name’ => ’nom_du_fichier’,
’path’ => ’chemin/vers/le/fichier’
)
un exemple ?
Marc
Sans réinstaller le script pour te répondre plus vite :
A priori, $pj doit avoir la forme suivante :
array(
array(
name => 'mon_fichier.ext',
path => '/chemin/absolu/vers/mon_fichier.ext'
);
);
$pj est un array de pièces jointes, chacune d’entre elles devant être un array.
Thierry
pour l’array c’est bon, c’est le chemin absolu qui me pose problème,
pour name j’ai mis :
$name = basename($_FILES[’avatar’][’name’]) ;
sur le chemin absoluje sèche
Marc
Pour le chemin absolu, $_FILES te propose déjà quelque chose, tu as juste à renseigner :
$path = $_FILES['avatar']['tmp_name'];
tmp_name contient le chemin absolu vers le répertoire temporaire où a été uploadé le fichier sur ton serveur.
Thierry
UN GRAND MERCI
si ça peut aider quelqu’un...
$name = basename($_FILES[’avatar’][’name’]) ;
$path = $_FILES[’avatar’][’tmp_name’] ;
$pj = array(
array(
name => ’’.$name.’’,
path => ’’.$path.’’
)
) ;
Marc
Ravi que ce script ait pu t’aider !
Thierry
je tourne en rond sur un autre problème, je viens abuser un peu...
j’ai besoin que mes mails partent uniquement en Bcc, j’ai tout essayé mais chaque destinataire voit les autres destinataires
Marc
Haa, désolé, je n’ai pas prévu le Bcc sur cette méthode.
Par contre les mails ne sont pas envoyés en cc non plus, aucun risque que les autres destinataires voient quoi que ce soit : l script envoie autant de mails qu’il y a de destinataires.
foreach($to as $dest)
mail($dest, $subject, $body, $headers);
eric
Bonjour,
est il possible d’insérer une image embarquée ?
merci
eric