Il arrive parfois de vouloir envoyer un mail en HTML et d’y incorporer des images. Généralement, il suffit de placer l’adresse absolue de l’image dans le tag correspondant. Cependant, il peut être nécessaire de lier l’image dans le mail, pour par exemple pouvoir relire le mail hors connexion.
Les différentes composantes d’un mail
Dans un mail il y a 3 grosses parties :
- Les entêtes qui indiquent ce que contient le mail, qui est le destinataire, qui est l’envoyeur, à qui faut il répondre, ….
- Le corps du message ( qu’il soit en HTML ou en texte simple )
- Les fichiers joins ( images, documents, …)
Ces trois parties sont séparées par un délimiteur qu’il convient de renseigner dans les entêtes du mail.
Le délimiteur
Il convient d’utiliser une séquence difficile à retrouver dans le reste du mail ( de façon à ne pas confondre une occurrence d’un texte avec le délimiteur ). On va le définir de la façon suivante et récupérer un délimiteur de 32 caractères.
<?php
$delimiteur = '--'.'---='.md5( uniqid( rand() ) );
?>
J’ai du couper les 4 tirets du délimiteur pour contrer les raccourci typographiques de spip :)
Les entêtes
Les entêtes sont importantes, une erreur bien placée pourrait vous donner l’envie de vous arracher les cheveux pendant 2 semaines sans jamais trouver la source de l’erreur.
On va définir le type MIME du message, , le sous type ou la nature du contenu du mail ( présentement « related » [1] ), l’adresse à laquelle répondre et l’envoyeur. On définit également quel sera la séquence du délimiteur servant à départager les différentes informations du mail.
<?php
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/related; boundary=\"$delimiteur\"\r\n";
$headers .= "Reply-to: $from\r\n";
$headers .= "From: $from\r\n";
$headers .= "\r\n";
?>
( ceci est une liste non exhaustive d’entêtes )
Référencer les images dans le mail
Afin d’insérer les images dans le mail, il convient d’assigner à chaque image une référence et indiquer dans le texte la référence. On appellera cette référence le « CID » [2].
On pars du principe que vous avez possédez déjà une liste des images de votre message HTML dans une variable nommée $imgListe( sinon il faudra trouver d’autre moyen comme preg_match_all, ou alors un listing de répertoire si jamais toutes les images de votre mail se retrouve « par chance » dans un même dossier. )
On va donc assigner à chaque image un identifiant nommé "image-*" où * sera remplacé par l’indice du tableau correspondant à cette image, et on remplacera l’occurence de cette image dans le contenu du mail ( symbolisé ici par $content ) par cet identifiant.
<?php
foreach($imgListe as $k => $v){
$content = str_replace($v, 'cid:image'.$k, $content);
}
?>


