Image de l'article Envoyer un mail en HTML, une newsletter avec PHP (partie 1)

Envoyer un mail en HTML, une newsletter avec PHP (partie 1)

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 :


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 :

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 :

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 :

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 :

envoiyer un mail html avec PHP

 

Image Viewer