Newsletter codée en HTML, PHP et MySQL

Voici un code permettant d'envoyer une newsletter au format HTML en utilisant une liste d'emails dans une base de données MySQL.

Avant de concevoir la newsletter, il convient de maitriser la fonction mail(). Quelques rappels :

Envoi d'un email en texte brut

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
</head>

<body>
    <h1>Envoi d'un email en texte brut</h1>
    <p>
        <?php
        $message = 'Madame, Monsieur,

    Voici un message en texte brut.

    Cordialement,
    Jules';

        $retour = mail('destinataire@free.fr', 'Email en texte brut', $message, 'From:expediteur@free.fr');
        if ($retour)
            echo "L'email en texte brut a bien été envoyé.";
        ?>
    </p>
</body>

</html>

Notez que les retours à la ligne du message seront pris en compte dans l'email expédié au format brut (texte simple), ce qui est très pratique.

Envoi d'un email au format HTML

Pour envoyer un email au format HTML, il faut mettre l'entête de l'email au format MIME (Multipurpose Internet Mail Extensions) qui permet à l'email de gérer des codages plus complexe que le basique ASCII.
Attention : les guillemets doubles autour des "\r\n" sont indispensables. Il permettent de générer un caractère de retour à la ligne dans l'entête de l'email.

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
</head>

<body>
    <h1>Envoi d'un email en HTML</h1>
    <p>
        <?php
        $entete  = 'MIME-Version: 1.0' . "\r\n";
        $entete .= 'Content-type: text/html; charset=utf-8' . "\r\n";
        $entete .= 'From: Expéditeur <expediteur@free.fr>' . "\r\n";

        $message = '<h1>Les livres sont arrivés</h1>
    <p>Nouvel arrivage de <strong>livres</strong> dans votre librairie préférée.</p>
    <img src="https://lesdocs.fr/livres.png">';

        $retour = mail('destinataire@free.fr', 'Email en HTML', $message, $entete);
        if ($retour)
            echo "L'email en HTML a bien été envoyé.";
        ?>
    </p>
</body>

</html>

Newsletter avec liste d'emails dans une table MySQL

Pour commencer, nous allons créer une table contenant une liste d'emails. Un seul champ peut suffire et vous pouvez définir l'email comme clef primaire du fait de son caractère unique.

newsletter

Dans le code ci-dessous, nous allons lire et stocker une lettre au format HTML dans une variable, puis nous allons l'expédier à une liste d'emails situés dans une table MySQL.

La lettre à expédier au format HTML :

lettre.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Newsletter</title>
</head>

<body>
    <h1>Les livres sont arrivés</h1>
    <p>Nouvel arrivage de <strong>livres</strong> dans votre librairie préférée.</p>
    <img src="https://lesdocs.fr/livres.png">
</body>

</html>

Il suffira de lancer la page ci-dessous pour expédier la lettre à tous les abonnés.

newsletter.php

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Newsletter HTML</title>
</head>

<body>
    <h1>Envoi de la newsletter</h1>
    <p>La newsletter a été envoyée au emails suivants :</p>
    <p>
    <?php
    $entete  = 'MIME-Version: 1.0' . "\r\n";
    $entete .= 'Content-type: text/html; charset=utf-8' . "\r\n";
    $entete .= 'From: Jules <jules@free.fr>' . "\r\n";

    $message = file_get_contents('lettre.html');

    $mysqli = new mysqli('localhost', 'root', 'root', 'essai');
    $sql = 'SELECT emails FROM newsletter';
    $resultat = $mysqli -> query($sql);
    while ($ligne = $resultat -> fetch_assoc()) {
        $retour = mail($ligne['emails'], 'Newsletter', $message, $entete);
        if ($retour)
            echo $ligne['emails'] . '<br>';
    }
    ?>
    </p>
</body>

</html>

Voici quelques règles d'intégrations pour l'email : http://email-a-table.fr/ressources-techniques/regles-dintegration