Une fonction complète d’envoi de mails en PHP

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
Zip - 1.8 ko
Fonction d’envoi de mails

Utilisation

envoi_mail($nom_from, $mail_from, $to, $subject, $data, $template_html, $template_txt, $pj);

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_mail('Marc Brillault', 'marc@brillault.fr', 'email@dest', 'Sujet', 'Hello World');

Envoi du même email à plusieurs personnes :

envoi_mail('Marc Brillault', 'marc@brillault.fr', array('email@dest', 'email2@dest'), 'Sujet', 'Hello World');

Envoi d’un email mixte :

$data = array(
 '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

[1J’utilise la fonction de jatinder diffusée sur PHPSense

9 commentaires sur "Une fonction complète d’envoi de mails en PHP"

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

Laissez votre commentaire