Envoi d'email authentifié via PHP ou Perl

De
Sauter à la navigation Sauter à la recherche

Chez HaiSoft, comme la plupart des hébergeurs luttant contre l'envoi de spams, la fonction d'envoi de mails non sécurisée PHP mail() est désactivée.

Il faut donc envoyer ses emails en SMTP avec authentification. Afin de mettre en place un envoi d'email via SMTP sur un site ne disposant pas de plugin dédié (comme Easy WP SMTP pour Wordpress par exemple), on peut utiliser différentes solutions.

Nous en verrons ici deux : PHPMailer et le module Perl "Net::SMTP".

PHPMailer

De nombreux modules d'envoi PHP comme Easy WP SMTP sont bases sur PHPMailer car son fonctionnement est simple et efficace.

Nous expliquons ici comment le mettre en place, et fournissons un script prêt à l'emploi, à modifier uniquement pour adapter à votre configuration SMTP.

Difficulté : Moyenne

Installation de PHPMailer

Dans votre hébergement, il faudra télécharger ces trois fichiers de PHPMailer et les placer à la racine de l'hébergement (dans "httpdocs") dans un dossier appelé "PHPMailer" :

Fonctionnement de PHPMailer

Si vous souhaitez utiliser notre script type, passez directement au point suivant "Intégration de PHPMailer".

Appel de PHPMailer

Votre script d'envoi SMTP devra faire appel à PHPMailer grâce aux lignes suivantes :

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'Exception.php';
require 'PHPMailer.php';
require 'SMTP.php';

Si vous avez placé les fichiers précédents dans un dossier différent, il faudra donc adapter le chemin vers ces fichiers.

Configuration de l'envoi PHPMailer

Ensuite, les paramètres suivants sont nécessaires pour définir les options d'envoi et de connexion SMTP :

$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';

$mail->isSMTP();					// Active l'envoi via SMTP
$mail->Host = 'srvXX.haisoft.net';			// À remplacer par le nom de votre serveur SMTP
$mail->SMTPAuth = true;					// Active l'authentification par SMTP
$mail->Username = 'user@example.com';			// Nom d'utilisateur SMTP (votre adresse email complète)
$mail->Password = 'secret';				// Mot de passe de l'adresse email indiquée précédemment
$mail->Port = 465;					// Port SMTP
$mail->SMTPSecure = "ssl";				// Utiliser SSL
$mail->isHTML(true);					// Format de l'email en HTML

Voici ensuite les paramètres liés au mail :

$mail->From = 'from@example.com';			// L'adresse mail de l'emetteur du mail (en général identique à l'adresse utilisée pour l'authentification SMTP)
$mail->FromName = 'Mon Site';				// Le nom de l'emetteur qui s'affichera dans le mail
$mail->addAddress('joe@example.net');			// Un premier destinataire
$mail->addAddress('ellen@example.com');			// Un second destifataire (facultatif)
							// Possibilité de répliquer la ligne pour plus de destinataires
$mail->addReplyTo('info@example.com');			// Pour ajouter l'adresse à laquelle répondre (en général celle de la personne ayant rempli le formulaire)
$mail->addCC('cc@example.com');				// Pour ajouter un champ Cc
$mail->addBCC('bcc@example.com');			// Pour ajouter un champ Cci

$mail->Subject = 'Sujet du mail';			// Le sujet de l'email
$mail->Body    = 'Contenu du message en HTML <b>en gras!</b>';		// Le contenu du mail en HTML
$mail->AltBody = 'Contenu du message pour les clients non HTML';	// Le contenu du mail au format texte

On effectue ensuite l'envoi avec cette condition :

if(!$mail->send()) {
    echo 'Le message ne peut être envoyé.';
    echo 'Erreur: ' . $mail->ErrorInfo;
} else {
    echo 'Message envoyé';
}

Intégration de PHPMailer

Voici un script type à copier dans un nouveau fichier (par exemple "mailer.php").
Il suffit ensuite d'appeler ce script dans votre formulaire HTML (bouton valider ou autre), via action=, par exemple: "action=mailer.php".

<?php
// Fichiers requis :
// https://raw.githubusercontent.com/PHPMailer/PHPMailer/master/src/Exception.php
// https://raw.githubusercontent.com/PHPMailer/PHPMailer/master/src/PHPMailer.php
// https://raw.githubusercontent.com/PHPMailer/PHPMailer/master/src/SMTP.php

//=====Configuration des paramètres d'expédition
    //=====Utilisateur SMTP (Adresse email complète existante sur le serveur)
    $username = "Adresse existante sur le serveur";
    //=====Mot de passe de l'adresse
    $password = "";
    //=====Nom du serveur sur lequel vos emails sont hébergés
    $smtphost = "srvXX.haisoft.net";

//=====Paramètres de contenu du mail
    //=====Adresse de destination du message (vous-meme pour un formulaire de contact).
    $to = "Adresse sur le serveur ou externe";
    //=====Définition du sujet de l'email.
    $subject = "Nouveau message sur votre site";
    //=====Définition des variables à récupérer depuis votre formulaire
    $email_auteur = $_POST['VARIABLE1'];
    $nom_auteur = $_POST['VARIABLE2'];
    $message = $_POST['VARIABLE3'];
    //=====Déclaration des messages au format texte
    $body = "Un nouveau message vous a été envoyé sur votre site :<br /><br />
                Auteur : ".$nom_auteur."<br />
                Mail : ".$email_auteur."<br />
                Contenu : ".$message;
    //==========

//=====Fonction d'envoi du mail - Rien à configurer ici
        use PHPMailer\PHPMailer\PHPMailer;
        use PHPMailer\PHPMailer\Exception;
        require 'Exception.php';
        require 'PHPMailer.php';
        require 'SMTP.php';

        $email = new PHPMailer;
        $email->CharSet = 'UTF-8';

        $email->isSMTP();
        $email->Host = $smtphost;
        $email->SMTPAuth = true;
        $email->Username = $username;
        $email->Password = $password;
        $email->Port = 25;
        $email->isHTML(true);

        $email->From = $username;
        $email->FromName = $nom_auteur;
        $email->addAddress($to);
        $email->addReplyTo($email_auteur, $nom_auteur);

        $email->Subject = $subject;
        $email->Body    = $body;
        $email->AltBody = $body;

//=====Envoi de l'e-mail.
        if(!$email->send()) {
            echo 'Le message ne peut être envoyé.';
            echo 'Erreur: ' . $email->ErrorInfo;
        } else {
            echo 'Merci, votre message a bien été envoyé.<br />';
            echo 'Vous allez être redirigé vers la page d\'accueil du site.<br />';
            header('Refresh: 5; URL=http://');
        }
//==========

?>

Ici, seules les 8 premières variables doivent être configurées

  • L'adresse email expéditrice
  • Le mot de passe
  • Le nom de serveur
  • L'adresse du destinataire
  • Le sujet
  • L'email de l'auteur (configuré pour être récupéré depuis le formulaire via POST : Il faudra juste adapter le nom de la variable à celle de votre formulaire)
  • Le nom de l'auteur (même instruction)
  • Le message (même instruction)

Résumé

Vous disposerez donc au total de 5 fichiers : - les 3 fichiers de PHPMailer ; - le script (plus haut) à copier/coller (nommé par exemple "mailer.php") ; - la page de votre formulaire de contact (nommée par exemple "contact.html") ;

Dans contact.html, vous devez avoir un formulaire ressemblant à ceci :

<form action="mailer.php" method="post">
  <div>
    <label for="email">Votre email : </label>
    <input type="email" name="email" id="email" required>
  </div>
  <div>
    <label for="name">Votre nom : </label>
    <input type="text" name="name" id="name" required>
  </div>
  <div>
    <label for="message">Votre message : </label>
    <textarea name="message" id="message" required></textarea>
  </div>
  <div>
    <input type="submit" value="Envoyer">
  </div>
</form>

La première ligne avec "form action=" fait donc appel au script PHP.

Module Perl "Net::SMTP"

Voici un script Perl vous permettant l'envoi d'email via SMTP :

#!/usr/bin/perl

$username = 'expediteur@exemple.tld';   # Adresse existante sur le serveur
$password = 'xxxxxxxx';                 # Mot de passe de l'adresse email
$smtphost = 'srvXX.haisoft.net';        # Nom du serveur sur lequel vos emails sont hébergés

$to = 'destinataire@exemple.tld';       # Destinataire du mail
$subject = 'Nouveau message';           # Sujet du mail
$body = 'Contenu du mail';              # Contenu du mail


use Net::SMTP;

my $smtp = Net::SMTP->new($smtphost,
        Port => 25);
$smtp->auth ( $username, $password ) or die "Erreur d'authentification\n";

$smtp->mail($username);
if ($smtp->to($to)) {
        $smtp->data();
        $smtp->datasend("To: <$username> \n");
        $smtp->datasend("From: <$to> \n");
        $smtp->datasend("Content-Type: text/html \n");
        $smtp->datasend("Subject: $subject");
        $smtp->datasend("\n");
        $smtp->datasend($body);
        $smtp->dataend();
} else {
        print "Error: ", $smtp->message();
}

$smtp->quit();