Foire aux questions

Personnaliser ses en-têtes mail

PHP permet d’envoyer simplement et rapidement un mail grâce à sa fonction mail().
<?php
mail('destinataire@mail.com', 'Titre du mail', 'Message du mail');
?>

Cependant, vous allez avoir une adresse d’expéditeur en  www-data@nodexx.cluster1.easy-hebergement.net, ce qui est bien évidemment pas très engageant pour celui qui reçoit le mail. Dans ce court tutoriel, nous allons voir comment personnaliser l’en-tête du mail pour modifier cette adresse d’expédition et la rendre plus conviviale.

1 – Qu’est-ce qu’un en-tête mail?

L’en-tête d’un mail renseigne sur plusieurs éléments essentiels au bon déroulement de la transmission de l’information. Il comprends l’expéditeur, le destinataire, la date et l’heure de l’envoi, le titre du mail et d’autres informations permettant de calculer si le mail est un spam.

Exemple d’un en-tête :
Delivered-To: destinataire@mail.com
Return-Path: <www-data@node12.cluster1.easy-hebergement.net>
Received: from node12.cluster1.easy-hebergement.net (localhost [127.0.0.1])
by node12.cluster1.easy-hebergement.net (Postfix) with ESMTP id AEA80EADB7
for <destinataire@mail.com>; Wed, 14 Aug 2013 11:05:32 +0200 (CEST)
To: destinataire@mail.com
Subject: Message de test
Date: Wed, 14 Aug 2013 11:05:32 +0200 (CEST)
From: www-data@node12.cluster1.easy-hebergement.net

Dans cet exemple, nous voyons que :
– le mail a été envoyé à « destinataire@mail.com« , champ « Delivred-To » et « To« .
– qu’il a été envoyé depuis « node12.cluster1.easy-hebergement.net« , champ « Received »
– qu’il a été envoyé par « www-data@node12.cluster1.easy-hebergement.net« , champ « From » et « Return-Path »

Vous l’aurez compris, nous allons devoir modifier ces deux derniers champs afin que notre mail ait un expéditeur plus rassurant.

2 – Modification de l’en-tête

Si vous avez lu le manuel PHP sur la fonction mail() vous avez surement constaté que cette fonction peut prendre jusqu’à 5 arguments.

Si nous reprenons notre premier bout de code.
<?php
mail('destinataire@mail.com', 'Titre du mail', 'Message du mail');
?>

Nous voyons qu’en première argument, nous avons l’adresse de destination, en second le titre de notre mail, et en troisième le message du mail. Afin de pouvoir modifier le nom de l’expéditeur, nous allons lui passer un quatrième argument qui va modifier l’en-tête.

Nous cherchons à modifier les champs « From » et « Return-Path » dans notre en-tête, nous allons donc remplir une variable $header avec les informations que nous voulons.
<?php
//On met notre expéditeur en variable pour n'avoir à le changer qu'à un seul endroit
$from = "Expéditeur <expediteur@mail.com>";

//On modifier l'expéditeur
$header = "From : ".$from."\n";

//On modifie l'adresse de retour en cas de non réception du mail
$header .= "Return-path : ".$from."\n";

//On modifie l'adresse de réponse du mail
$header .= "Reply-to : ".$from."\n";
?>

Maintenant que nous avons les bonnes informations, il ne nous reste plus qu’à les passer à notre mail, et le tour est joué.
<?php
mail('destinataire@mail.com', 'Titre du mail', 'Message du mail', $header);
?>

Après un test, nous constatons que l’en-tête a bien été modifié
Delivered-To: destinataire@mail.com
Received: from node12.cluster1.easy-hebergement.net (localhost [127.0.0.1])
by node12.cluster1.easy-hebergement.net (Postfix) with ESMTP id AEA80EADB7
for <destinataire@mail.com>; Wed, 14 Aug 2013 11:05:32 +0200 (CEST)
To: destinataire@mail.com
Subject: Message de test
Date: Wed, 14 Aug 2013 11:05:32 +0200 (CEST)
From:
Expéditeur <expediteur@mail.com>
Return-Path: Expéditeur <expediteur@mail.com>
Reply-To: Expéditeur <expediteur@mail.com>

3 – Code complet

<?php
//On crée des variables pour n'avoir à changer les informations qu'à un seul endroit
$to = "detinataire@mail.com";
$from = "Expéditeur <expediteur@mail.com>";
$subject= "Titre du mail";
$message = "Message du mail";

//On modifier l'expéditeur
$header = "From : ".$from."\n";

//On modifie l'adresse de retour en cas de non réception du mail
$header .= "Return-path : ".$from."\n";

//On modifie l'adresse de réponse du mail
$header .= "Reply-to : ".$from."\n";

//On envoie le mail
mail($to, $subject, $message, $header);
?>