mail()
Découvrez la fonction mail() en PHP pour envoyer des e-mails depuis un script, avec sa syntaxe, ses paramètres et ses bonnes pratiques.
La fonction mail() envoie des e-mails directement depuis un script PHP. C'est la méthode intégrée la plus simple pour envoyer du courrier, et ce guide couvre sa syntaxe et ses paramètres, le fonctionnement des en-têtes, l'envoi de messages HTML et à plusieurs destinataires, les failles de sécurité à éviter, et quand il vaut mieux utiliser une bibliothèque dédiée.
Qu'est-ce que la fonction mail() ?
La fonction mail() est une fonction PHP intégrée qui remet un e-mail à l'agent de transfert de courrier (MTA) du système — généralement sendmail sous Linux — ou au serveur SMTP configuré dans php.ini. Comme elle dépend de cette configuration locale, mail() retourne fréquemment false (ou échoue silencieusement à livrer le message) sur une machine de développement sans MTA installé. Elle n'ouvre pas elle-même une connexion SMTP, donc elle ne peut pas s'authentifier auprès d'un fournisseur externe comme Gmail.
Une valeur de retour true signifie uniquement que le message a été accepté pour livraison par le MTA — ce n'est pas une garantie que l'e-mail est parvenu dans la boîte de réception du destinataire.
Syntaxe
mail(
string $to,
string $subject,
string $message,
array|string $additional_headers = [],
string $additional_params = ""
): bool| Paramètre | Requis | Description |
|---|---|---|
$to | Oui | Adresse(s) du destinataire. Plusieurs adresses sont séparées par des virgules, ex. "[email protected], [email protected]". |
$subject | Oui | La ligne d'objet. Ne doit pas contenir de retours à la ligne. |
$message | Oui | Le corps du message. Chaque ligne doit être séparée par \r\n et ne pas dépasser 70 caractères. |
$additional_headers | Non | En-têtes supplémentaires tels que From, Cc, Bcc, Content-Type. Une chaîne (séparée par CRLF) ou, depuis PHP 7.2, un tableau associatif. |
$additional_params | Non | Options supplémentaires transmises à la ligne de commande du MTA (ex. -f pour définir l'expéditeur de l'enveloppe). |
Comment utiliser la fonction mail()
Voici un exemple complet en texte brut qui construit les en-têtes et vérifie la valeur de retour :
<?php
$to = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP';
// Additional headers
$headers = 'From: [email protected]' . "\r\n"
. 'Reply-To: [email protected]' . "\r\n"
. 'X-Mailer: PHP/' . phpversion();
// Send the email and check the result
if (mail($to, $subject, $message, $headers)) {
echo "Email sent successfully.";
} else {
echo "Email delivery failed.";
}
?>Nous définissons le destinataire, l'objet et le message, puis construisons les en-têtes. Comme mail() retourne un booléen, il est conseillé de vérifier la valeur de retour plutôt que de supposer que l'envoi a réussi. L'en-tête From est important : sans lui, de nombreux serveurs de messagerie rejettent le message ou le marquent comme spam.
Envoyer un e-mail HTML
Pour envoyer du HTML à la place du texte brut, ajoutez Content-Type: text/html aux en-têtes. Sans cela, le client affiche les balises brutes en tant que texte.
<?php
$to = '[email protected]';
$subject = 'HTML email test';
$message = '<h1>Hello</h1><p>This message is <b>HTML</b>.</p>';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: [email protected]\r\n";
mail($to, $subject, $message, $headers);
?>Plusieurs destinataires, Cc et Bcc
Placez plusieurs adresses dans $to (séparées par des virgules) pour la ligne "À" visible, et utilisez les en-têtes Cc/Bcc pour les copies :
<?php
$to = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'See attached agenda.';
$headers = "From: [email protected]\r\n";
$headers .= "Cc: [email protected]\r\n";
$headers .= "Bcc: [email protected]\r\n";
mail($to, $subject, $message, $headers);
?>Les destinataires en Bcc sont cachés de tous les autres, tandis que les adresses en Cc sont visibles par tous les destinataires.
Sécurité : éviter l'injection d'en-têtes
Si une partie du destinataire, de l'objet ou des en-têtes provient d'une saisie utilisateur — par exemple un formulaire de contact — un attaquant peut injecter des retours à la ligne supplémentaires pour ajouter ses propres en-têtes Cc/Bcc et détourner votre serveur pour envoyer du spam. Validez toujours les adresses et supprimez les sauts de ligne avant de les passer à mail() :
<?php
$email = $_POST['email'] ?? '';
// Reject anything that is not a valid email address
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
exit('Invalid email address.');
}
// Strip CR/LF so the value can't inject new headers
$email = str_replace(["\r", "\n"], '', $email);
?>Utilisez filter_var() avec FILTER_VALIDATE_EMAIL pour valider, et consultez Validation de formulaire PHP et Gestion des URL/e-mails dans les formulaires pour des pratiques de traitement sécurisé des formulaires.
Limitations et quand utiliser une bibliothèque
mail() convient aux messages simples et à faible volume, mais elle présente de vraies limites :
- Elle ne peut pas s'authentifier auprès d'un serveur SMTP externe (pas de nom d'utilisateur/mot de passe, pas de handshake TLS).
- Elle n'offre pas de support natif pour les pièces jointes — vous devez construire les parties MIME manuellement.
- Les rapports d'erreur sont minimaux : un retour
falsevous dit peu de choses sur pourquoi la livraison a échoué.
Pour la production, les e-mails transactionnels ou tout ce qui comporte des pièces jointes, utilisez une bibliothèque dédiée comme PHPMailer ou Symfony Mailer. Elles gèrent l'authentification SMTP, l'encodage, les pièces jointes et offrent de bien meilleurs rapports d'erreur.
Conclusion
La fonction mail() offre un moyen rapide d'envoyer des e-mails directement depuis PHP et convient parfaitement aux notifications simples lorsqu'un MTA fonctionnel est disponible. N'oubliez pas que son succès dépend de la configuration du serveur, que vous devez vous protéger contre l'injection d'en-têtes avec les données fournies par l'utilisateur, et que les systèmes en production sont généralement mieux servis par PHPMailer ou Symfony Mailer. Pour approfondir le sujet, explorez les fonctions PHP et la fonction header().