mail

(PHP 3, PHP 4 , PHP 5)

mail -- Envoi un mail

Description

bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]] )

mail() poste automatiquement le message message à destination de to. Les destinataires multiples doivent être séparés par des virgules. Les emails avec pièces jointes ou contenus particuliers (comme les emails en HTML), peuvent être réalisés avec cette fonction. Il faut respecter l'encodage MIME. Pour plus de détails, voyez http://www.zend.com/zend/spotlight/sendmimeemailpart1.php et les classes PEAR MIME.

Les RFC suivantes peuvent aussi se révéler utiles : RFC 1896, RFC 2045, RFC 2046, RFC 2047, RFC 2048 et RFC 2049.

mail() retourne TRUE si le mail est envoyé, et FALSE sinon.

Avertissement

L'implémentation de la fonction mail() sur les systèmes Microsoft Windows est différente en plusieurs points par rapport à celle des systèmes Unix. Premièrement, mail() n'utilise pas un binaire local pour composer le message mais opère uniquement sur les sockets directement, ce qui signifie qu'un MTA (Mail Transfert Agent) doit écouter un socket réseau (qui peut être local ou distant). Deuxièmement, les en-têtes personnalisés comme From:, Cc:, Bcc: et Date: ne sont pas par le MTA dans un premier temps, mais sont parsés par PHP. Seules les versions de PHP inférieures à la version 4.3 supportent l'en-tête Cc: (et est sensible à la casse). Les versions de PHP >= 4.3 supportent toutes les en-têtes mentionnés et ne sont pas sensibles à la casse.

Exemple 1. Envoi de courrier électronique (mail)

<?php
mail
("maxou@example.com", "Mon Sujet", "Ligne 1\nLigne 2\nLigne 3");
?>

Le quatrième argument passé sera inséré à la fin de l'en-tête. Typiquement, cela permet d'insérer des en-têtes supplémentaires. Les en-têtes multiples doivent être séparés par des retours chariots et des caractères de nouvelle ligne (\r\n).

Note : Vous devez utiliser les caractères \r\n pour séparer les en-têtes bien que quelques MTA Unix remplacent automatiquement \n par \r\n (revient à doubler \r si \r\n est utilisé).

Exemple 2. Envoi de eMail avec des en-têtes supplémentaires

<?php
mail
("personne@example.com", "Le sujet", $message,
     
"From: webmaster@{$_SERVER['SERVER_NAME']}\r\n"
    
."Reply-To: webmaster@{$_SERVER['SERVER_NAME']}\r\n"
    
."X-Mailer: PHP/" . phpversion());
?>

Le paramètre additional_parameters peut être utilisé pour passer un paramètre additionnel au programme, défini lorsqu'il envoie le mail en utilisant le paramètre de configuration sendmail_path. Par exemple, cela peut être utilisé pour définir l'adresse d'expédition lorsque le logiciel sendmail est utilisé avec l'option -f. Vous devriez sûrement ajouter l'utilisateur sous lequel tourne votre serveur web à votre configuration sendmail afin d'éviter qu'un en-tête 'X-Warning' ne soit ajouté à votre message lorsque vous utilisez cette méthode pour définir l'adresse d'expédition.

Exemple 3. Envoi de eMail avec des en-têtes supplémentaires et un paramètre de ligne de commande supplémentaire

<?php

mail
("personne@example.com", "Le sujet", $message,
     
"From: webmaster@{$_SERVER['SERVER_NAME']}", "-fwebmaster@{$_SERVER['SERVER_NAME']}");
?>

Note : Le cinquième paramètre a été ajouté depuis la version 4.0.5 de PHP. Depuis la version 4.2.3 de PHP, ce paramètre est désactivé dans le safe_mode et la fonction mail() affichera un message d'avertissement et retournera FALSE si vous tentez de l'utiliser.

Vous pouvez aussi utiliser des techniques simples de concaténation de chaînes pour construire des messages complexes :

Exemple 4. Envoi de mail complexe avec mail()

<?php
/* destinataire */
$to  = "Mary <mary@example.com>" . ", " ; // notez la virgule
$to .= "Kelly <kelly@example.com>";

/* sujet */
$subject = "Anniversaires à souhaiter en Août";

/* message */
$message = '
<html>
<head>
<title>Rappel des anniversaires d\'Août</title>
</head>
<body>
<p>Voici la liste des anniversaires du mois d\'Août!</p>
<table>
<tr>
  <th>Ami</th><th>Jour</th><th>Mois</th><th>Année</th>
</tr>
<tr>
  <td>Guillaume</td><td>3</td><td>Août</td><td>1970</td>
</tr>
<tr>
  <td>Sandra</td><td>17</td><td>Août</td><td>1973</td>
</tr>
</table>
</body>
</html>
'
;

/* Pour envoyer un mail au format HTML, vous pouvez configurer le type Content-type. */
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";

/* D'autres en-têtes */
$headers .= "To: Mary <mary@example.com>, Kelly <kelly@example.com>\r\n";
$headers .= "From: Birthday Reminder <birthday@example.com>\r\n";
$headers .= "Cc: birthdayarchive@example.com\r\n";
$headers .= "Bcc: birthdaycheck@example.com\r\n";

/* et hop, à la poste */
mail($to, $subject, $message, $headers);
?>

Note : Assurez-vous qu'il n'y ait aucune nouvelle ligne (ou d'autres espaces ou caractères blancs) dans les paramètres to ou subject, car cela peut avoir des effets secondaires irrationnels.

Note : Le paramètre to ne peut pas être une adresse de la forme "Quelqu'un <quidam@example.com>". La commande mail ne traitera pas correctement ce format vers le MTA (tout particulièrement sur les systèmes Microsoft Windows).

Voir aussi imap_mail().