W3docs

PHP Mail

Découvrez la fonction mail() en PHP pour envoyer des e-mails depuis un script, avec exemples et bonnes pratiques.

La fonction intégrée mail() de PHP envoie des e-mails directement depuis un script — sans bibliothèque supplémentaire. C'est le moyen le plus rapide d'envoyer une notification, un message « contactez-nous » ou un lien de réinitialisation de mot de passe. Ce chapitre explique la signature de la fonction, présente des exemples en texte brut et en HTML, et aborde les pièges liés à la sécurité et à la délivrabilité qui posent problème en production.

Ce que fait la fonction mail()

mail() remet un message à l'agent de transfert de courrier (MTA) local du serveur — le programme (comme Sendmail, Postfix ou Exim) qui relaie réellement le courrier vers l'extérieur. PHP ne communique pas directement avec des serveurs SMTP distants ; il se contente de mettre le message en file d'attente localement. Si l'hôte ne dispose pas d'un MTA fonctionnel, mail() renvoie false et rien n'est envoyé.

La fonction retourne un booléen : true si le message a été accepté pour livraison (ce n'est pas la même chose qu'livré), et false en cas d'échec.

Syntaxe

mail(
    string $to,
    string $subject,
    string $message,
    array|string $additional_headers = [],
    string $additional_params = ""
): bool
ParamètreRequisDescription
$toOuiAdresse(s) du ou des destinataires. Séparez plusieurs adresses par une virgule.
$subjectOuiLigne d'objet. Ne doit pas contenir de sauts de ligne.
$messageOuiLe corps de l'e-mail. Les lignes doivent être séparées par \r\n et ne pas dépasser 70 caractères.
$additional_headersNonEn-têtes supplémentaires tels que From, Reply-To ou Content-Type. Depuis PHP 7.2, ce paramètre peut être un tableau associatif.
$additional_paramsNonOptions de ligne de commande supplémentaires transmises au MTA (par exemple, l'expéditeur d'enveloppe via -f).

Envoyer un e-mail en texte brut

Il s'agit du cas le plus courant : un simple message texte avec quelques en-têtes.

<?php
$to      = '[email protected]';
$subject = 'Test email';
$message = 'This is a test email from PHP.';

// Additional headers
$headers  = 'From: [email protected]' . "\r\n";
$headers .= 'Reply-To: [email protected]' . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion();

if (mail($to, $subject, $message, $headers)) {
    echo 'Email sent successfully.';
} else {
    echo 'Failed to send email.';
}
?>

Nous définissons le destinataire, l'objet et le corps, puis construisons une chaîne d'en-têtes. L'en-tête From identifie l'expéditeur, Reply-To contrôle où vont les réponses, et X-Mailer est informatif. Les en-têtes sont joints avec \r\n (retour chariot + saut de ligne), qui est le terminateur de ligne requis par le protocole e-mail.

Envoyer un e-mail HTML

Pour envoyer du HTML mis en forme, ajoutez Content-type: text/html aux en-têtes. Sans cela, le destinataire verra les balises brutes au lieu du rendu.

<?php
$to      = '[email protected]';
$subject = 'HTML email';
$message = '
<html>
<body>
    <h1>Hello!</h1>
    <p>This message is <strong>formatted with HTML</strong>.</p>
</body>
</html>';

// To send HTML mail, the Content-type header must be set
$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);
?>

Envoyer à plusieurs destinataires

Passez une liste séparée par des virgules dans $to, ou utilisez les en-têtes Cc/Bcc :

<?php
$to      = '[email protected], [email protected]';
$subject = 'Team update';
$message = 'Meeting moved to 3 PM.';

$headers  = 'From: [email protected]' . "\r\n";
$headers .= 'Bcc: [email protected]' . "\r\n";

mail($to, $subject, $message, $headers);
?>

Se protéger contre l'injection d'en-têtes

Si une partie d'un en-tête — notamment From ou Reply-To — provient d'une saisie utilisateur (comme un formulaire de contact), un attaquant peut injecter des sauts de ligne supplémentaires pour ajouter ses propres en-têtes et transformer votre script en relais de spam. Ne mettez jamais de données utilisateur brutes dans les en-têtes. Validez et assainissez d'abord :

<?php
// $_POST['email'] comes from an untrusted form
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);

if ($email === false) {
    exit('Invalid email address.');
}

// Strip any line breaks that could be used to inject headers
$email = str_replace(["\r", "\n"], '', $email);

$headers = 'From: ' . $email . "\r\n";
mail('[email protected]', 'Contact form', 'New message', $headers);
?>

Consultez filter_var() et le chapitre PHP Filter pour en savoir plus sur la validation des entrées, et PHP Form Validation pour gérer les données de formulaire en toute sécurité.

Délivrabilité et remarques pour la production

Remarque : La fonction mail() dépend du MTA local du serveur. Sur de nombreux environnements d'hébergement modernes, elle échoue silencieusement ou les messages arrivent dans les spams sans configuration appropriée. Pour les applications réelles, préférez une bibliothèque établie comme PHPMailer ou Symfony Mailer, qui prennent en charge l'authentification SMTP, les pièces jointes, l'encodage et la mise en file d'attente. Quelle que soit la solution choisie, configurez des enregistrements SPF, DKIM et DMARC valides pour votre domaine afin que les fournisseurs de messagerie fassent confiance à vos messages.

Un true retourné signifie uniquement que le MTA a accepté le message — ce n'est pas une confirmation de livraison. Pour suivre la livraison réelle, les rebonds et les ouvertures, utilisez un service d'e-mail transactionnel.

Cas d'usage courants

  • Formulaires de contact — collecter un message et l'envoyer par e-mail au propriétaire du site (à combiner avec PHP Form Handling).
  • Notifications — confirmations de commande, alertes, réinitialisations de mot de passe.
  • Rapports — scripts planifiés qui envoient un résumé par e-mail.

Conclusion

La fonction mail() de PHP offre un moyen rapide et sans dépendance d'envoyer des e-mails depuis un script : fournissez le destinataire, l'objet et le corps, puis ajoutez des en-têtes pour l'expéditeur, l'adresse de réponse ou le contenu HTML. Gardez à l'esprit ses limitations — elle dépend d'un MTA configuré, renvoie une acceptation plutôt qu'une confirmation de livraison, et ne doit jamais recevoir de données utilisateur non assainies dans ses en-têtes. Pour tout ce qui dépasse un envoi simple et à faible volume, utilisez une bibliothèque dédiée. Pour continuer à progresser, explorez PHP Functions et PHP Strings.

Pratique

Pratique
Quels sont les paramètres de la fonction PHP mail() ?
Quels sont les paramètres de la fonction PHP mail() ?
Was this page helpful?