Spécifications

Fonction mail()

Voir aussi

Email avec Zend Framework

6.Le langage PHP

6.18.Envoyer un mail

6.18.1.Introduction

Il existe de nombreuses bonnes raisons pour être amené à vouloir envoyer un email via PHP: Email de confirmation d'inscription, Alerte webmaster lorsqu'un utilisateur propose un lien, etc.
Nous verrons donc dans ce tutorial comment avec la fonction PHP dédiée il est possible d'envoyer un simple mail texte et l'importance de spécifier un entête. Puis par la suite, nous verrons comment se construit un mail lorsque l'on souhaite y ajouter des fichiers joints. Et enfin nous nous tournerons vers le framework PHP Zend afin de nous aider dans la construction de tels mails.
Notez toutefois que la possibilité d'envoyer des mails via PHP est rarement (jamais?) proposée par les hébergeurs gratuits et cela ce comprend aisement. En effet, il est si simple avec ce procédé d'envoyer des milliers d'emails à des adresses stockées en base de données que les hébergeurs sont soumis à 2 risques principaux: 1- Voir leurs resources systèmes diminuer fortement (au risque d'écrouler le serveur) 2- Etre accusé de faciliter le "spamming".

6.18.2.La fonction mail()

La fonction de base pour envoyer un courrier électronique est mail(). Dont la syntaxe simplifiée est mail(<adresse du destinataire>,<titre du mail>,<corps du message>);
Ainsi pour envoyer un mail à testemail@toutestfacile.com (pensez à remplacer par votre propre adresse pour voir le résultat) dont le titre serait "test email 1" et le message "merci pour ton tutoriel", cela donne le script suivant:
<?php
$destinataire = 'testemail@toutestfacile.com';
echo "Ce script envoie un mail à $destinataire";
mail($destinataire, 'test email 1', 'merci pour ton tutoriel');
?>
warning
  • Pour une utilisation sous windows il convient de modifier le fichier php.ini[où?]. Celui-ci contient 2 champs dans la rubrique [mail functions]. L'un SMTP doit indiquer le compte smtp de votre fournisseur d'accès (qui est généralement de la forme mail.<domaine> ou smtp.<domaine>). L'autre sendmail_from doit indiquer votre adresse email.
  • Chez certains hébergeurs la fonction mail est remplacée par une fonction email (il s'agit d'une variante de mail destinée à limiter les possibles abus évoqués en introduction). Je vous invite alors à consulter votre hébergeur pour en connaître la syntaxe
  • Il est possible que votre fournisseur d'accès refuse l'envoi de votre email s'il n'arrive pas à vous identifier (et à vous autoriser l'envoi d'emails).

6.18.3.Entête de mail

6.18.3.1.Pour préciser l'adresse de l'expéditeur et l'adresse de retour

Avec l'exemple précédent, le destinataire du mail recevra bien le message mais avec un entête indiquant une adresse email de l'expéditeur et une adresse email pour la réponse déterminée par le serveur. Or le serveur est susceptible de déterminer que l'adresse mail de l'expéditeur est webmaster@monsite.com alors que l'adresse mail de l'expéditeur (et de réponse) doit être l'adresse d'un responsable d'une section du site (ex: moi@monsite.com). Heureusement, il est possible de spécifier cette information de la façon suivante:
<?php
$destinataire = 'testemail@toutestfacile.com';
$expediteur   = 'moi@monsite.com';
$reponse      = $expediteur;
echo "Ce script envoie un mail à $destinataire ".
     "en précisant que l'expediteur est $expediteur ".
     "et que la réponse doit être envoyée à $reponse";
mail($destinataire,
     'test email 1bis',
     'merci pour ton tutorial',
     "From: $expediteur\r\nReply-To: $reponse");
?>
Vous pouvez donc constater que la syntaxe complète de la fonction mail est mail(<adresse du destinataire>,<titre du mail>,<corps du message>,<entête>);
Il est évidemment possible d'indiquer des adresses différentes pour l'expéditeur (From) et la réponse (Reply-To).

6.18.3.2.Pour préciser le type de contenu (Content-Type) et l'encodage

L'entête du mail permet de spécifier bien plus de champs que les simples adresses d'expéditeur ou de retour. Comme par exemple:
  • Content-Type : Comme pour tout "Content-Type" permet de préciser la nature du contenu du mail et l'encodage du texte (nous vous encourageons évidemment à privilégier l'UTF-8)
warning Chaque entête doit être séparé de l'autre par les retours chariots "\r\n" (attention dans ce cas à bien préciser la chaîne de caractères entre guillemets et non entre simples apostrophes).

6.18.3.3.Pour envoyer un mail au format HTML

Pour envoyer un mail "basique" au format HTML il suffit donc de préciser le type de contenu.
<?php
$destinataire = 'testemail@toutestfacile.com';
$expediteur   = 'moi@monsite.com';
$reponse      = $expediteur;

echo "Ce script envoie un mail au format HTML à $destinataire";
$codehtml=
    '<html><body>'.
    '<h1>Test Email</h1>'.
    '<b><u>Ceci est un document HTML</u></b><br>'.
    'Avec differentes tailles de caractères et '.
    '<font color="red">couleurs</font>'.
    '</body></html>';
mail($destinataire,
     'Email au format HTML',
     $codehtml,
     "From: $expediteur\r\n".
        "Reply-To: $reponse\r\n".
        "Content-Type: text/html; charset=\"UTF-8\"\r\n");
?>
Si vous souhaitez intégrer des images à votre mail en HTML, vous devrez préciser des URL complètes (c.a.d. commençant par http://) ou joindre les images au mail ce qui est une autre histoire (voir plus loin).