Forum-webmaster
Technique - programmation => HTML / CSS / XHTML => Message commencé par: motoroil le le 10-01-2009 a 19:20:43

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.