Ce script permet d'envoyer un email au format HTML par le serveur avec les images (fond, gif) incluses dans le message. Les anciens clients-mail afficheront à la place un message en texte brut.
Tout d'abord, pas besoin de la classe mail_mime.php.
Ensuite, observez comment sont manipulées les parties.
Tout d'abord, il faut savoir que votre mail ne doit pas contenir de lignes de PLUS DE 76 caractères.
Cela provoquera un mail illisible chez de nombreuses personnes.
L'EN-TETE MAIL
Rien d'exceptionnel ! Hormis le Multipart/alternative (et non plus mixeed !)
Notez la frontière "boundary=---xxxx"
Il s'agit d'une frontière définie par un nombre aléatoire.
<?php function sendmailpj($destinataire,$subject,$message,$pj,$pjn){
// variables perso $fond = "images/fond.jpg"; // (fichiers à placer dans le repertoire images (voir fopen...) $signature= "images/signature.gif"; $expediteur = "Vincent LAPINOU<bob.lapinou@esayconnect.fr>"; // <--------------------- // $message="message";
// ----------------------------------Construction de l'entête // On construit une FRONTIERE aléatoire (allez savoir pourquoi !?) $boundary = "-----=".md5(uniqid(rand())); // On indique le fichier fond
// Version du format MIME utilisé $header = "MIME-Version: 1.0\n"; // Type de contenu. Ici plusieurs parties de type different "multipart/ALTERNATIVE" // Avec un frontière définie par $boundary $header .= "Content-Type: multipart/Alternative; \n boundary=\"$boundary\"\n"; $header .= "\n";
// -----------------------------------Construction du message
// Message pour les softs ne supportant PAS le format MIME. $msg = "Ceci est un message au format MIME 1.0 multipart/mixed.\n";
// 1ère partie du message Le texte BRUT (pour ceux qui refusent les mails HTML) (y'en a!) // Chaque partie du message est séparée par LA FRONTIERE $msg .= "--$boundary\n"; // Et pour chaque partie on en indique le type $msg .= "Content-Type: Text/Plain;\n charset=\"iso-8859-1\"\n"; // Et comment il sera codé $msg .= "Content-Transfer-Encoding: quoted-printable\n\n";
// Message HTML au format MIME. $msg .= "--$boundary\n"; // Le type $msg .= "Content-Type: Text/HTML;\n charset=\"iso-8859-1\"\n"; // Et comment il sera codé $msg .= "Content-Transfer-Encoding: quoted-printable\n\n"; // Notez la référence background=3Dcid:08F04D95-4B0E-422B-9138-D5716797DB74 // c'est cette référence qui va appeller l'image dans le language html ! $msg .="<html><BODY style=3D\"BACKGROUND-POSITION: right bottom; FONT-SIZE: 12pt; \n"; $msg .="MARGIN: 10px; BACKGROUND-REPEAT: no-repeat; FONT-FAMILY: Arial\"\n"; $msg .=" text=3D#b0ffff vLink=3D#fce38d aLink=3D#fce38d link=3D#fce38d \n"; $msg .="bgProperties=3Dfixed bgColor=3D#0420a7\n"; $msg .=" background=3Dcid:08F04D95-4B0E-422B-9138-D5716797DB74 scroll=3Dyes>\n"; $msg .= "\n";
// --------------------------------- // 2nde partie du message // Le fichier FOND // --------------------------------- // Tout d'abord lire le contenu du fichier $fp = fopen($fond, "rb"); // b c'est pour les windowsiens (binary) $attachment = fread($fp, filesize("images/".$fond)); fclose($fp); // puis convertir le contenu du fichier en une chaîne de caractères // conforme au format RFC 2045 (lignes de 76 caractères) $attachment = chunk_split(base64_encode($attachment)); // Ne pas oublier que chaque partie du message est séparé par une frontière $msg .= "--$boundary\n"; // Et pour chaque partie on en indique le type $msg .= "Content-Type: image/jpg; name=\"$fond\"\n"; // Et comment il sera codé $msg .= "Content-Transfer-Encoding: base64\n"; // -----ICI L'ASTUCE POUR RECUPERER LA PIECE JOINTE ! (sinon ce serait une PJ ordinaire $msg .= "Content-ID: <08F04D95-4B0E-422B-9138-D5716797DB74>\n"; // Il est indispensable d'introduire une ligne vide entre l'entête et le texte $msg .= "\n"; // C'est ici que l'on insère le code du fichier lu $msg .= $attachment . "\n"; $msg .= "\n\n";