Envoyer un email avec PHP

I. Introduction à la fonction PHP mail()

C'est une demande qui est récurrente sur notre forum, et de la part des utilisateurs débutants avec PHP en général : comment peut-on envoyer un email à partir d'une page web en PHP ?

C'est ce que nous allons voir dans ce tutoriel, que je vais scinder en deux parties :
- Envoyer un email avec la fonction mail() native de PHP (pour les débutants)
- Envoyer un email avec Zend Framework (Programmation orientée objet)

II. Explications

1. Envoyer un email au format texte

Pour envoyer un email basique en PHP, rien de plus simple, il suffit d'utiliser la fonction mail().
En paramètre, elle prend respectivement le destinataire, le sujet, le message, et (optionnellement) des en-têtes.
La manière la plus simple d'envoyer un email texte est donc la suivante :

$message = "Hello World";
mail([email protected]', 'Mon Sujet', $message);

C'est donc très simple, mais un peu limité de cette façon. En effet, vous ne spécifiez pas l'expéditeur, ne pouvez pas spécifier de personne à placer en copie (pour envoyer un mail à plusieurs personnes), etc.

Avec les en-têtes additionnelles que vous pouvez passer en 4ème paramètre, vous allez pouvoir personnaliser un peu tout ça. Voici quelques en-têtes couramment utilisées :

$headers ='From: "mon nom"<[email protected]>' . "\n";
$headers .='To: Mary <[email protected]>, Kelly <[email protected]>' . "\n";
$headers .='Cc: [email protected]' . "\n";
$headers .='Bcc: [email protected]' . "\n";
$headers .='Reply-To: [email protected]' . "\n";
$headers .='MIME-Version: 1.0' . "\n";
$headers .='Content-Type: text/plain; charset="iso-8859-1"' . "\n";
$headers .='Content-Transfer-Encoding: 8bit';

$message = "Hello World";
mail([email protected]', 'Mon Sujet', $message, $headers);

Vous remarquerez que toutes les en-têtes sont concaténées (mises bout à bout avec les ".="), et qu'il faut placer un saut de ligne à la fin de chaque en-tête, d'où le caractère "n" à la fin de chacune d'entre elles.

Attention : j'ai mis des "\n" pour les retours à la ligne, mais si ça ne fonctionne pas pour vous, vous pouvez essayer en remplaçant les "\n" par "\rn", car cela dépend des serveurs mail.

Je vais maintenant détailler l'utilité de ces en-têtes (liste non exhaustive, il en existe d'autres) :

  • From : le nom et l'adresse email de l'expéditeur
  • To : le nom et l'adresse d'un ou plusieurs destinataires (supplémentaires, car comme nous venons de le voir, on peut déjà spécifier un destinataire en premier paramètre de la fonction mail)
  • Cc : d'autres destinataires qui recevront le mail en "Carbon Copy". Ils seront en copie et pourront voir à qui le message à été transmis.
  • Bcc : d'autres destinaires qui recevront le mail en "Blind Carbon Copy". Ils seront en copie mais ne pourront pas voir à qui le message à été transmis, c'est une copie cachée.
  • Reply-To : permet de spécifier une adresse email de réponse différente de l'adresse d'expéditeur, si vous souhaitez que l'on vous réponde sur une autre adresse.
  • MIME-Version : la version du type mime utilisé
  • Content-Type : pour spécifier le type mime du mail et le charset (jeu de caractères). Souvent vous utiliserez "text/plain" comme type pour un email au format texte, et "text/html" pour un email au format html (que nous allons voir plus bas).
  • Content-Transfer-Encoding : cet en-tête permet de spécifier l'encodage du mail ou de l'une de ses parties (pour un envoi texte + html par exemple). Il peut par exemple prendre les valeurs 7 et 8 bit (l'encodage 7 bit étant utilisé dans les pays anglophones n'ayant pas besoin de gérer les lettres accentuées)



2. Envoyer un email au format HTML

Nous avons déjà fait le plus gros du travail dans le précédent paragraphe, car il n'y a pas grand chose à modifier pour pouvoir envoyer un email au format html.
Il suffira de modifier le "Content-type" comme ceci :

$headers .='Content-Type: text/html; charset="iso-8859-1"' . "\n";

Il ne vous restera qu'à, bien entendu, modifier le corps du message pour y insérer du code html.
Voici un exemple d'envoi de mail en html avec PHP, sur cet exemple je vais placer le logo de 6ma.fr au début du message, et pour insérer une image, il faut obligatoirement utiliser le format html.

$headers ='From: "mon nom"<[email protected]>' . "\n";
$headers .='To: Mary <[email protected]>, Kelly <[email protected]>' . "\n";
$headers .='Cc: [email protected]' . "\n";
$headers .='Bcc: [email protected]' . "\n";
$headers .='Reply-To: [email protected]' . "\n";
$headers .='MIME-Version: 1.0' . "\n";
$headers .='Content-Type: text/html; charset="iso-8859-1"' . "\n";
$headers .='Content-Transfer-Encoding: 8bit';

$message = "<html><head><title>Mon titre</title></head>";
$message .= "<body><img src='http://www.6ma.fr/image/bannieres/6ma-181x72.png' />
<br /><br /> Hello World</body></html>";
mail([email protected]', 'Mon Sujet', $message, $headers);

Par rapport à l'envoi du mail au format texte, j'ai donc uniquement changé le "Content-Type" dans l'en-tête du mail, et le corps du message stocké dans la variable $message.
Dans le corps, il faut placer le code html classique, comme vous le feriez pour faire une page web en html.

Ici, dans l'email qui sera envoyé, nous aurons donc le logo de 6ma.fr, deux sauts de ligne, et en dessous le texte "Hello World".

III. Conclusion du tutorial

Voilà, nous venons de voir comment envoyer un email avec PHP, que ce soit au format texte tout simple, ou au format html qui permet d'insérer plus de choses : des images, liens, etc.

Toutefois, il reste à voir des possibilités plus avancées car, me direz-vous :
- comment envoyer un email aux formats texte + html combinés ? (afin que quelqu'un, qui ne peut pas lire le html, voit tout de même le message au format texte)
- comment envoyer une pièce jointe ?

Dans le tutoriel suivant, nous verrons comment réaliser tout cela, en introduisant en parallèle l'envoi de mails avec Zend Framework.