La Communauté Webmaster  forum rss


  Forum-webmaster
  Technique - programmation
  HTML / CSS / XHTML
(Modérateurs: Shain, Netah, Lilian, lauryv, ToToMaStEr)
  mail html AVEC images en pièce jointe (sans URL distante)
« Précédent Suivant »
Pages: [1] Descendre
Répondre    Aviser des réponses    Envoyer le sujet    Imprimer
  Auteur  Sujet: mail html AVEC images en pièce jointe (sans URL distante)  (Lu 2979 fois)
mail html AVEC images en pièce jointe (sans URL distante)
« sur: le 10-01-2009 a 19:20:43 »
motoroil
Membre récent
*

Hors-Ligne

Messages: 1



Je suis un lama!

Voir le Profil
Répondre avec citation

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,

Rapporter au modérateur  

Re:mail html AVEC images en pièce jointe (sans URL distante)
« Répondre #1 sur: le 10-01-2009 a 22:29:27 »
MarvinLeRouge
Superactif
****

Hors-Ligne

Messages: 584





Voir le Profil    WWW
Répondre avec citation

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);
}

Rapporter au modérateur  

Développeur web / Création de site internet
jean@ceugniet.com
Jean Ceugniet, Développement web
SIRET : 523 611 044 00018
Répondre    Aviser des réponses    Envoyer le sujet    Imprimer
Pages: [1] Monter
« Précédent Suivant »
Sauter à: 

Votre statut : Invité
Vous devez être membre pour participer.
 
 
Let’s Encrypt : le certificat SSL gratuit
Tester votre site internet sur différents navigateurs
[WordPress] Des problèmes avec l’administration ?
Rappel : Mettez à jour vos CMS et vos sites E-commerce
Le .fr fête ses 25 années d’existence !
Mesurer votre audience en temps réel avec BubbleStat
Porter réclamation contre Google Panda ?
Zlio n’est plus …
 
 
 
 
 

Copyright (c) Devclic 2002 - 2026 - Tous droits réservés

creation site internet strasbourg