Tous les services opérationnels Devise EUR Aucun frais de mise en service Vous êtes à La Réunion ?
‹ Hébergement web et Plesk

Envoyer un mail en PHP depuis son site

Pour envoyer un mail en PHP, la fonction mail() suffit techniquement : elle remet le message au serveur de messagerie de l'hébergement, qui l'expédie. Mais un message parti ainsi finit souvent en indésirable, faute d'authentification. La méthode fiable consiste à envoyer par SMTP, en se connectant à une vraie boîte de votre domaine, avec une bibliothèque comme PHPMailer. Sur un hébergement Hubspace, le serveur à utiliser est hub.hubspace.fr.

Par Jonathan Dewaele · publié le

Cet article vaut pour un site écrit en PHP, ou un cadriciel comme Laravel ou Symfony. Pour WordPress, voir Les e-mails des formulaires n'arrivent pas, qui passe par une extension.

Ce que fait la fonction mail()

La fonction mail() prend le destinataire, le sujet, le corps et des en-têtes. Sur nos hébergements, PHP la confie à sendmail, qui transmet le message au serveur de messagerie Postfix de hub.hubspace.fr. Le message part donc de notre serveur, au nom de votre domaine.

Sa documentation prévient : la fonction renvoie vrai quand le message est « accepté pour livraison », ce qui ne garantit pas qu'il arrivera. Un script qui affiche « message envoyé » ne prouve donc rien.

Trois raisons font qu'un message envoyé par mail() est mal reçu :

  • l'adresse d'expéditeur est souvent mal réglée, ou inventée ;
  • aucun mot de passe n'est vérifié : la messagerie qui reçoit n'a que l'adresse du serveur pour juger ;
  • si l'enregistrement SPF de votre domaine n'autorise pas notre serveur, le message est tenu pour suspect.

La méthode fiable : SMTP avec une vraie boîte

Envoyer par SMTP, c'est faire ce que fait un logiciel de messagerie : se connecter au serveur avec l'adresse et le mot de passe d'une boîte, puis déposer le message. L'expéditeur est alors authentifié.

  1. Créez une adresse dédiée aux envois du site, par exemple [email protected], en suivant Créer une adresse mail professionnelle.
  2. Installez PHPMailer. Avec Composer, en SSH ou dans les commandes d'un déploiement Git, à partir de l'offre Sérénité et une fois l'accès SSH activé dans Plesk : composer require phpmailer/phpmailer. Sans Composer, son dépôt officiel explique comment inclure ses fichiers à la main.
  3. Rangez l'adresse et le mot de passe dans un fichier de configuration placé hors du dossier public du site, jamais dans un fichier versionné.
  4. Écrivez l'envoi, sur le modèle ci-dessous.
  5. Testez vers une boîte Gmail ou Outlook, puis regardez dans quel dossier le message arrive.

Le code suit l'exemple du README de PHPMailer, version 7 :

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';
$conf = require '/chemin/hors/du/site/mail.php';

$mail = new PHPMailer(true);
try {
    $mail->isSMTP();
    $mail->Host       = 'hub.hubspace.fr';
    $mail->SMTPAuth   = true;
    $mail->Username   = $conf['adresse'];
    $mail->Password   = $conf['mot_de_passe'];
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    $mail->Port       = 465;

    $mail->setFrom($conf['adresse'], 'Mon site');
    $mail->addAddress('[email protected]');
    $mail->addReplyTo($emailDuVisiteur);
    $mail->Subject = 'Nouveau message du formulaire';
    $mail->Body    = $texte;
    $mail->send();
} catch (Exception $e) {
    error_log('Envoi impossible : ' . $mail->ErrorInfo);
}

Le port 465 chiffre dès la connexion. Le port 587 fonctionne aussi, avec PHPMailer::ENCRYPTION_STARTTLS. L'identifiant est l'adresse complète. Ces réglages sont ceux de Serveur SMTP et IMAP : les réglages.

L'expéditeur et la réponse

Le message doit partir de l'adresse qui s'authentifie, à votre domaine. L'adresse d'un visiteur qui remplit un formulaire va dans l'en-tête de réponse (addReplyTo), jamais dans l'expéditeur : un message « au nom » d'une adresse Gmail parti de notre serveur échoue aux contrôles d'authentification, et risque le rejet ou les indésirables.

Ne mettez jamais dans un en-tête une donnée saisie par un visiteur sans la vérifier : un retour à la ligne glissé dans un champ permet d'ajouter des destinataires et de faire envoyer du courrier indésirable par votre site. PHPMailer contrôle les adresses qu'on lui passe ; avec mail(), c'est à votre code de le faire.

Le SPF de votre domaine

Même en SMTP, le message part de notre serveur. L'enregistrement SPF de votre domaine doit l'autoriser : le modèle de Plesk contient a:hub.hubspace.fr. Votre zone DNS est le plus souvent chez votre bureau d'enregistrement ou chez Cloudflare : c'est là qu'il faut vérifier l'enregistrement, comme l'explique L'enregistrement SPF. La signature DKIM, qui renforce encore la confiance, s'active domaine par domaine : demandez-la-nous si votre domaine ne l'a pas.

Questions fréquentes

Puis-je continuer à utiliser mail() ?

Oui, elle fonctionne. Pour quelques notifications internes, envoyées à votre propre adresse, elle peut suffire si le SPF de votre domaine autorise notre serveur. Pour écrire à vos clients, l'envoi par SMTP authentifié est nettement plus sûr.

Combien de messages puis-je envoyer depuis mon site ?

Le site est fait pour des messages de service : formulaires, confirmations, mots de passe. Pour une lettre d'information ou des envois en nombre, passez par un service d'envoi spécialisé, qui gère les désinscriptions et la réputation des envois.

Mon script indique que le message est parti, mais rien n'arrive. Pourquoi ?

Regardez d'abord le dossier des indésirables du destinataire, puis le SPF du domaine. Si l'envoi se fait par SMTP, activez le mode débogage de PHPMailer le temps d'un essai pour lire la réponse du serveur. Les messages d'erreur sont expliqués dans E-mail non distribué : lire le message d'erreur.

Articles liés