Titre: mail html AVEC images en pièce jointe (sans URL distante)
Posté par: motoroil le le 10-01-2009 a 19:20:43
Bonsoir,
Je suis bloqué sur un problème d'envoi de mail au format HTML.
J'ai au préalable réalisé avec succés un mail HTML en faisant référence à des images hébergées sur un serveur distant du type :
<img src="http://www.monserveurdistant/newsletter/200902/images/HeaderNewsletter.gif" width="640" height="211" alt="">
Le problème est le suivant : le plus gros destinataire (en CA) de cette newsletter possède une connexion internet très restreinte qui permet aux utilisateurs de recevoir uniquement leur courrier mais en aucun cas de se connecter à internet (donc malheureusement impossible de lire les images hébergées sur le serveur distant...)
>Le mail est beaucoup moins sexy ::)
Solution théorique : il me manque la mise en pratique...
J'ai pensé à embarquer les images en Pièces jointes et d'y faire références dans mon gabarit HTML via la commande :
<img src="cid.."> ... </img> (mais je ne comprends pas bien comment)
Je trouve que peu d'information sur le web quant à la marche à suivre. (En général les gens ne veulent pas envoyer d'images en PJ)
Si quelqu'un a déjà rencontré ce problème, qu'il connaît la mise en oeuvre de cette technique ou une solution de détournement, j'en serai ravi :)
cordialement,
|
Titre: Re:mail html AVEC images en pièce jointe (sans URL distante)
Posté par: MarvinLeRouge le le 10-01-2009 a 22:29:27
Salut,
Ca devrait marcher (il me semble) en :
- encodant le fichier image dans le corps du mail avec un identifiant (cid)
- faire appel à cette image en utilisant le cid comme attribut src de l'image
Ci-après une fonction qui devrait (il me semble) marcher. Regarde ce qui concerne la signature
Code:
// pj : Pièce jointe pjn : nom de la pièce jointe // messageTexte et HTML sont indépendants; pj, pjn, fond et signature sont optionnels
function sendmailpj ($expediteur, $destinataire, $subject, $messageTexte, $messageHTML, $pj, $pjn, $fond, $signature) { // echo ("sendmailpj ($expediteur, $destinataire, $subject, $messageTexte, $messageHTML, $pj, $pjn, $fond, $signature)"); // ----------------------------------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"; // Ici, le message texte $messageTexte = eregi_replace ("\\\'", "'", $messageTexte); $msg.= $messageTexte; $msg.= "\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>\n"; $msg.= "<BODY style=3D\"FONT-SIZE: 12px; FONT-FAMILY: Arial, Helvetica, sans-serif;\" text=3D#000000 vLink=3D#cc00cc aLink=3D#0000cc link=3D#0000cc "; if ($fond) { $msg.= "bgProperties=3Dfixed bgColor=3D#0420a7 "; $msg.= "background=3Dcid:08F04D95-4B0E-422B-9138-D5716797DB74 "; } $msg.= "scroll=3Dyes>\n"; $msg.= "\n"; $msg.= $messageHTML; $msg.= "\n"; if ($signature) { $msg.= "<BR>"; $msg.= "<FONT face=3D\"Arial, Helvetica, sans-serif\" size=3D2>\n"; $msg.= "______________________________________________________________<BR>\n"; $msg.= "</FONT>\n"; $msg.= "<FONT face=3D\"Times New Roman\" size=3D2>\n"; $msg.= "<A href=3D\"mailto:".$expediteur."\"><IMG alt=3D\"\" "; $msg.= "hspace=3D0 \n src=3D\"cid:4923555B-0D28-4533-B917-07177C51A263\" \n"; $msg.= "align=3Dabsmiddle border=3D0></A>\n"; $msg.= "</FONT>\n"; } $msg.= "</BODY></HTML>\n"; $msg.= "\n";
if ($fond) { // --------------------------------- // 2nde partie du message // Le fichier FOND // --------------------------------- // Tout d'abord lire le contenu du fichier echo ("Encodage fichier $fond"); $fp = fopen ($fond, "rb"); // b c'est pour les windowsiens (binary) if (!$fp) { exit ("Erreur : impossible de trouver le fichier de fond $fond"); } else { $attachment = fread ($fp, filesize ($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"; } } if ($signature) { // Le fichier SIGNATURE // --------------------------------- echo ("Encodage fichier $signature"); $fp = fopen ($signature, "rb"); if (!$fp) { exit ("Erreur : impossible de trouver le fichier de signature $signature"); } else { $attachment = fread ($fp, filesize ($signature)); fclose ($fp); $attachment = chunk_split (base64_encode ($attachment)); $msg.= "--$boundary\n"; $msg.= "Content-Type: image/gif; name=\"$signature\"\n"; $msg.= "Content-Transfer-Encoding: base64\n"; $msg.= "Content-ID: <4923555B-0D28-4533-B917-07177C51A263>\n"; $msg.= "\n"; $msg.= $attachment . "\n"; $msg.= "\n\n"; } } if ($pj) { // Le fichier PJ // --------------------------------- echo ("Encodage fichier $pj"); $fp = fopen ($pj, "rb"); if (!$fp) { exit ("Erreur : impossible de trouver la pièce jointe $pj"); } else { $attachment = fread ($fp, filesize ($pj)); fclose ($fp); $attachment = chunk_split (base64_encode ($attachment)); $msg.= "--$boundary\n"; $msg.= "Content-Type: unknown/unknown; name=\"" . $pjn . "\"\n"; $msg.= "Content-Transfer-Encoding: base64\n"; $msg.= "\n"; $msg.= $attachment . "\n"; $msg.= "\n\n"; } } // voilà, on indique la fin par une nouvelle frontière // ET SEULEMENT LA (sinon les parties annexes disparaissent) $msg.= "--$boundary--\n"; $resultat = mail ($destinataire, $subject, $msg,"Reply-to: $expediteur\nFrom: $expediteur\n".$header); return ($resultat); }
|
|
|
Forum-webmaster | Actionné par YaBB SE
© 2001-2003, YaBB SE Dev Team. Tous droits réservés.
|