Je ne m'intéresse qu'à la partie envoi, pas à la gestion des adresses ou au contenu de la newsletter.
Une newsletter c'est avant tout un email. Mais un email c'est quoi ? C'est un contenu texte composé d'une entête et d'un corps de message. L'entête est une suite de champ structurée tandis que le corps est un texte non structuré. Le corps du message peut avoir différentes alternatives. Si vous intégrez des pièces jointes, ce sera des alternatives supplémentaires.
Vous devez gérez au minimum une version texte et une version HTML. Je vous recommande de ne pas négliger la version texte, même si elle est moin sexy que la version HTML.
Comment envoyer un email avec PHP ?
En PHP on envoie un email avec la fonction mail()
qui attend 3 paramètres obligatoires :
- Le destinataire
- Le sujet
- Le contenu
if(mail('bart@test.net', 'Liste des courses', "N'oublie pas de passer au tabac Bart.")){
// le message a été envoyé
}else{
// une erreur est survenue
}
La fonction mail()
peut également recevoir deux paramètres facultatifs :
- Des entêtes
- Des paramètres complémentaires
Les entêtes d'un email
Passons sur les paramètres complémentaires (dont je ne connais pas l'utilité) pour nous intéresser aux entêtes. Les entêtes standards les plus courantes pour un email sont :
To:
le destinataire.From:
l'expéditeur.Date:
la date d'écriture du message.Cc:
(Carbon Copy), une liste d'adresse qui seront affichés pour chaque destinataire.Bcc:
(Blind Carbon Copy), une liste d'adresse que le serveur SMTP masquera.MIME-Version:
indique que le message est formaté en MIME. Utilisez la valeur 1.Content-type:
un type MIME qui désigne le type de contenu de l'email.Reply-To:
l'adresse email à laquelle répondre.
Notez bien que To:
et Subject:
sont inutiles avec la fonction PHP mail()
, puisque ce sont les premier et second paramètres cette fonction.
// entete de l'email
$entete = "From: \"robot\" <cron@monsite.fr>\r\n";
$entete .= "Reply-to: \"webmaster\" <admin@monsite.fr>\r\n";
$entete .= "Organization: \"Gemini int.\"\r\n";
$entete .= "MIME-Version: 1.0\r\n";
$entete .= "X-Mailer:PHP".phpversion()."\r\n";
// corps de l'email
$msg = "N'oublie pas de passer au tabac Bart.";
// envoi de l'email
if(mail('bart@test.net', 'Liste des courses', $msg, $entete)){
// le message a été envoyé
}else{
// une erreur est survenue
}
Vous pouvez définir la priorité du message avec les entêtes, bien que ça ne soit pas standardisé :
// entete de l'email
$entete .= "MIME-Version: 1.0\r\n";
$entete .= "Importance: High\r\n";
$entete .= "X-Priority: 3\r\n";
// corps de l'email
$msg = "N'oublie pas de passer au tabac Bart.";
// envoi de l'email
if(mail('bart@test.net', 'Liste des courses', $msg, $entete)){
// le message a été envoyé
}else{
// une erreur est survenue
}
Il existe également une entête X-MSMail-Priority
pour les logiciels Microsoft, mais si vous ne définissez pas X-MimeOLE
, votre email sera probablement considéré comme un spam.
Envoyer un email HTML avec alternative texte en PHP
Le principe est identique à email classique. Mais le corps de l'email va contenir la version texte et la version HTML. Pour les différencier vous devez :
- définir un type MIME
Content-type: multipart/alternative;
- générer un séparateur pour chaque version
- entourer chaque version avec le séparateur
- définir le séparateur dans l'entête avec
boundary=
- définir un type MIME pour chaque version
Content-Type: text/plain
pour la version texteContent-Type: text/html
pour la version HTML
Voici un exemple de code pour un email HTML avec alternative texte :
// version texte
$txt = "N'oublie pas de passer au tabac Bart.";
// version html
$html = "<html><body bgcolor=\"#abdeff\"><center><img src=\"http://blog.niap3d.com/img/4/20150606185037.gif\" width=\"150\" height=\"150\" alt=\"\"><h1>Attention !</h1><p>N'oublie pas de passer au tabac Bart.</p></center></html></body>";
// on génère un séparateur
// il séparera les différentes versions du corps de l'email
// parmis lesquelles le logiciel de mail fera son choix
$sepAlternative = '-----='.md5(uniqid(mt_rand()));
// entete du message
$entete = "From: \"webmaster\" <admin@monsite.fr>\r\n";
$entete .= "Reply-to: \"webmaster\" <admin@monsite.fr>\r\n";
$entete .= "Organization: \"Gemini int.\"\r\n";
$entete .= "MIME-Version: 1.0\r\n";
$entete .= "X-Mailer:PHP".phpversion()."\r\n";
// dans l'entete on définit le séparateur qui sera utilisé dans le corps du message
$entete .= "Content-type: multipart/alternative; boundary=\"$sepAlternative\"\r\n";
// corps du message
// 1- on commence par un séparateur pour signifier la début des versions alternatives
// on affiche toujours deux tirets avant le séparateur
$msg = "--$sepAlternative\n";
// 2- on affiche des entêtes pour la version texte
$msg .= "Content-Type: text/plain; charset=\"UTF-8\"\n";
$msg .= "Content-Transfer-Encoding: 8bits\n\n";
// 3- on place la version texte
$msg .= $txt."\n\n";
// 4- on ajoute un séparateur pour signifier la fin d'une version alterntive et le début d'une autre
$msg .= "--$sepAlternative\n";
// 5- on affiche des entêtes pour la version HTML
$msg .= "Content-Type: text/html; charset=\"UTF-8\"\n";
$msg .= "Content-Transfer-Encoding: 8bits\n\n";
// 6- on affiche la version HTML
$msg .= $html."\n\n";
// 7- on affiche un séparateur suivi de deux tirets pour signifier la fin des versions alternatives
// Attention.
// N'oubliez pas de rajouter les deux tirets après le séparateur
// sinon vous aurez des problèmes à l'affichage
$msg .= "--$sepAlternative--\n";
// envoi l'email
mail('bart@test.net', 'Liste des courses', $msg, $entete);
Pour tester le code remplacez l'adresse 'bart@test.net' par la votre.
Le résultat sera quelque chose comme :