PHP : envoyer un mail au format Texte et HTML

Publié le

L'envoi des emails est souvent délicat, car on ne sait pas quel client mail utilise le destinataire : serait-il capable d'afficher l'HTML, ne prend-t-il en charge que le texte ?

Pour palier à ce problème, il existe une méthode simple qui permet d'envoyer le mail à la fois en Texte et en HTML, et le client mail choisir la partie qui l'intéresse.

Au début, je me suis beaucoup inspiré de cette fonction de Nexen qui marche bien dans la plupart des cas, mais pose encore des cas dans certains webmail (Free de mémoire).

Donc en cherchant un peu, je me suis mis à tester les emails dans tous les sens pour arriver à une fonction qui marche bien.

Il suffit donc d'avoir une variable pour le contenu en texte et une autre pour le contenu en HTML et le tour est joué. (En passant par une fonction qui le fait, c'est super rapide...)

Voici donc le bout de code (brut de pomme, c'est extrait d'une grosse classe...) : a vous de remettre ça en fonction ou de l'utiliser comme bon vous semble !

$site = "www.machin.com";
$from = "exp@machin.com";
$nom = "Expéditeur";
$to = "dest@machin.com";
$sujet = "Hello !";
$text = "Hello every Body !!!";
$html = "

Hello !

";

$from = $nom." <".$from.">";

$limite = "_----------=_parties_".md5(uniqid (rand()));

$header = "Reply-to: ".$from."\n";
$header .= "From: ".$from."\n";
$header .= "X-Sender: <".$site.">\n";
$header .= "X-Mailer: PHP\n";
$header .= "X-auth-smtp-user: ".$from." \n";
$header .= "X-abuse-contact: ".$from." \n";
$header .= "Date: ".date("D, j M Y G:i:s O")."\n";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/alternative; boundary=\"".$limite."\"";

$message = "";

$message .= "--".$limite."\n";
$message .= "Content-Type: text/plain\n";
$message .= "charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: 8bit\n\n";
$message .= $text;

$message .= "\n\n--".$limite."\n";
$message .= "Content-Type: text/html; ";
$message .= "charset=\"iso-8859-1\"; ";
$message .= "Content-Transfer-Encoding: 8bit;\n\n";
$message .= $html;

$message .= "\n--".$limite."--";
mail($to, $sujet, $message, $header);

Vous l'aurez compris, le contenu en texte doit être dans $text et celui en HTML dans $html Vous pouvez aussi modifié pour changer le mail de l'abuse (je ne sais pas si c'est bien efficace, si les anti-spam se base dessus à 1 moment donné ou pas.) Enfin, le fait de dire de quel site vient le mail permet d'éviter dans la plupart des cas d'être considéré par du spam par Hotmail.

Enfin, on fait la coupure entre les 2 mails (car c'est bien ça : un mail en texte et un mail en HTML dans un seul) grâce à Content-Type: multipart/alternative; boundary="$limite" qui indique que le mail contient différents formats et que ces parties sont délimités par $limite. Puis dans l'email en lui-même, après mettre la fameuse limite, on indique le type du mail (texte ou html). Et voilà le tour est joué !

Si vous avez des problèmes, des suggestions ou bien si vous utilisez ce bout de code, merci de laisser un commentaire ;)