Sascha B.: PEAR Mail_Mime - Probleme mit eingebetteter Grafik in HTML-Mail

Hallo zusammen,

mittels Mail_Mime möchte ich eine HTML-Mail verschicken, in der ich eingebettete Grafiken verwende. Der PHP-Code unten funktioniert für Microsoft Outlook 2007, bei anderen Clients wie Thunderbird (und diversen Webmail-Clients) hingegen wird die eingebettete Grafik als Anhang angezeigt und nicht in der HTML-Mail dargestellt.

Mit den Parametern (CRLF, Encoding usw.) habe ich bereits "herumgespielt", allerdings ohne Ergebnis.

Hat jemand Erfahrung hiermit und/oder kennt dieses Problem?

Vielen Dank vorab für Eure Unterstützung!

Beste Grüße,
Sascha

--

Der folgende PHP-Code basiert auf dem Beispiel unter http://pear.php.net/ ... example.php

  
include('Mail.php');  
include('Mail/mime.php');  
  
$mime = new Mail_mime("\r\n");  
  
$headers = array(  
                    'From'     => 'Firstname Lastname <example@example.com>',  
                    'Subject'  => $subject  
           );  
  
$image = $_SERVER['DOCUMENT_ROOT'] . '/images/test.jpg';  
  
$html  = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";  
$html .= "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"de-DE\">";  
$html .= "<head>";  
$html .= "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />";  
$html .= "<meta http-equiv=\"content-style-type\" content=\"text/css\" />";  
$html .= "<meta http-equiv=\"content-script-type\" content=\"text/javascript\" />";  
$html .= "</head>";  
$html .= "<body>";  
$html .= "<p>Message</p>";  
$html .= "<img src=\"cid:" . basename($image) . "\" style=\"width: 320px; height: 320px; border: none;\" width=\"320\" height=\"240\" border=\"0\" alt=\"\" />";  
$html .= "</body>";  
$html .= "</html>";  
  
$plain  = "Message ...\n";  
$plain .= "Message ...\n";  
  
$mime->setTXTBody($plain);  
$mime->setHTMLBody($html);  
  
$mime->addHTMLImage(file_get_contents($image), 'image/jpeg', basename($image), false);  
  
$body    = $mime->get(array('text_encoding' => '8bit', 'head_charset' => 'UTF-8', 'text_charset' => 'UTF-8', 'html_charset' => 'UTF-8'));  
$headers = $mime->headers($headers);  
  
$mail =& Mail::factory('mail');  
$mail->send("Firstname Lastname <example@example.comexample@example.com>", $headers, $body);  

--

Dies ist der Body, den der durch Mime_Mail erzeigt wird (Grafik und HTML gekürzt):

--=_76676333af51f969e6af1ea30f9dada9  
Content-Transfer-Encoding: 7bit  
Content-Type: text/plain; charset=UTF-8  
  
--=_76676333af51f969e6af1ea30f9dada9  
Content-Type: multipart/related;  
 boundary="=_207b44ab093f8cccbb0845e755a202c7"  
  
--=_207b44ab093f8cccbb0845e755a202c7  
Content-Transfer-Encoding: quoted-printable  
Content-Type: text/html; charset=UTF-8  
  
%HTML_MAIL%  
--=_207b44ab093f8cccbb0845e755a202c7  
Content-Transfer-Encoding: base64  
Content-ID: <7ce201431aac45ffc0211fa3454685e1>  
Content-Type: image/jpeg;  
 name=mail-1.jpg  
Content-Disposition: inline;  
 filename=test.jpg  
  
%BASE64_ENCODED_IMAGE%  
--=_207b44ab093f8cccbb0845e755a202c7--  
  
--=_76676333af51f969e6af1ea30f9dada9--  

  1. Hi,

    Der PHP-Code unten funktioniert für Microsoft Outlook 2007, bei anderen Clients wie Thunderbird (und diversen Webmail-Clients) hingegen wird die eingebettete Grafik als Anhang angezeigt und nicht in der HTML-Mail dargestellt.

    das wird möglicherweise daran liegen, dass diese Clients so eingestellt sind, dass sie keine HTML-Mails anzeigen sollen. Die zeigen also den Plaintext-Teil an, bieten dir aber die enthaltenen Bilder, die dir sonst entgehen würden, zusätzlich als Attachments an.

    --=_76676333af51f969e6af1ea30f9dada9
    Content-Transfer-Encoding: 7bit
    Content-Type: text/plain; charset=UTF-8

    --=_76676333af51f969e6af1ea30f9dada9
    Content-Type: multipart/related;
    boundary="=_207b44ab093f8cccbb0845e755a202c7"

    --=_207b44ab093f8cccbb0845e755a202c7
    Content-Transfer-Encoding: quoted-printable
    Content-Type: text/html; charset=UTF-8

    %HTML_MAIL%
    --=_207b44ab093f8cccbb0845e755a202c7
    Content-Transfer-Encoding: base64
    Content-ID: <7ce201431aac45ffc0211fa3454685e1>
    Content-Type: image/jpeg;
    name=mail-1.jpg
    Content-Disposition: inline;
    filename=test.jpg

    %BASE64_ENCODED_IMAGE%
    --=_207b44ab093f8cccbb0845e755a202c7--

    --=_76676333af51f969e6af1ea30f9dada9--

    Die Gesamtstruktur der Mailnachricht sieht nämlich für mich korrekt aus.

    So long,
     Martin

    --
    Lieber Blödeleien als blöde Laien.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hallo Martin,

      Danke für die Antwort - Die Einstellung der Clients habe ich vorher überprüft. Es wird bei allen die HTML-Version einer Nachricht angezeigt. Nur die Grafiken werden in der HTML-Version nicht angezeigt.

      Beste Grüße,
      Sascha

      1. Hallo,

        Danke für die Antwort - Die Einstellung der Clients habe ich vorher überprüft. Es wird bei allen die HTML-Version einer Nachricht angezeigt. Nur die Grafiken werden in der HTML-Version nicht angezeigt.

        okay, mir ist auch noch was aufgefallen:

        $html .= "<img src="cid:" . basename($image) . "" style="width: 320px; height: 320px; border: none;" width="320" height="240" border="0" alt="" />";

        Content-ID: <7ce201431aac45ffc0211fa3454685e1>

        Die im HTML-Teil angegebene Content-ID (cid) ist definitiv eine andere als im Subheader des entsprechenden Teils der Mailnachricht. Wie soll da die Zuordnung funktionieren?

        Ciao,
         Martin

        --
        Lieber Blödeleien als blöde Laien.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Die im HTML-Teil angegebene Content-ID (cid) ist definitiv eine andere als im Subheader des entsprechenden Teils der Mailnachricht. Wie soll da die Zuordnung funktionieren?

          Dummerweise kann ich die von Mime_Mail generierte CID nicht abgreifen, um diese im HTML-Code der Nachricht zu verwenden.

          Die Methode addHTMLImage() gibt laut Dokumentation lediglich "true" zurück. Siehe http://pear.php.net/manual/en/ ... addhtmlimage.php

          Somit kann ich nur über den Dateinamen arbeiten. Oder habe ich in der Dokumentation eine Methode zum Abgreifen der CID übersehen?

          Vielen Dank und beste Grüße,
          Sascha

          1. Hi,

            Die Methode addHTMLImage() gibt laut Dokumentation lediglich "true" zurück. Siehe http://pear.php.net/manual/en/ ... addhtmlimage.php

            Somit kann ich nur über den Dateinamen arbeiten. Oder habe ich in der Dokumentation eine Methode zum Abgreifen der CID übersehen?

            Du hast in den (oder die) User Notes übersehen, dass man die CID gar nicht manuell abgreifen muss, sondern sich setHTMLBody in Kombination addHTMLImage wohl automatisch darum zu kümmert; man muss nur an beiden Stellen *exakt* die gleichen Pfadangaben benutzen.

            MfG ChrisB

            --
            RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
            1. Hallo Chris.

              Du hast in den (oder die) User Notes übersehen, dass man die CID gar nicht manuell abgreifen muss, sondern sich setHTMLBody in Kombination addHTMLImage wohl automatisch darum zu kümmert; man muss nur an beiden Stellen *exakt* die gleichen Pfadangaben benutzen.

              Ich nutze aber doch an beiden Stellen exakt den gleichen Pfad - addHTMLImage() übergebe basename($image) als Dateinamen und auf die gleiche Weise verwende ich dies auc als CID im Image-Tag.

              Siehe

              ... $html .= "<img src=\"cid:" . basename($image) . "\" style=\"width: 320px; height: 320px; border: none;\" width=\"320\" height=\"240\" border=\"0\" alt=\"\" />"; ...

              Content-Transfer-Encoding: base64  
              Content-ID: <7ce201431aac45ffc0211fa3454685e1>  
              Content-Type: image/jpeg;  
               name=test.jpg  
              Content-Disposition: inline;  
               filename=test.jpg
              

              Wie bereits gesagt - In Outlook 2007 funktioniert dies auch einwandfrei, nur in anderen Mail-Clients nicht.

              Beste Grüße,
              Sascha

              1. Hi,

                Du hast in den (oder die) User Notes übersehen, dass man die CID gar nicht manuell abgreifen muss, sondern sich setHTMLBody in Kombination addHTMLImage wohl automatisch darum zu kümmert; man muss nur an beiden Stellen *exakt* die gleichen Pfadangaben benutzen.

                Ich nutze aber doch an beiden Stellen exakt den gleichen Pfad - addHTMLImage() übergebe basename($image) als Dateinamen und auf die gleiche Weise verwende ich dies auc als CID im Image-Tag.

                Mann, jetzt *lese* doch bitte die Beispiele in den Nutzerkommentaren auf der Seite, istdenndassoschwer?

                Du setzt die CID *N*I*C*H*T* selber, sondern lässt die Finger davon und das Modul sich darum kümmern.

                MfG ChrisB

                --
                RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                1. Du setzt die CID *N*I*C*H*T* selber, sondern lässt die Finger davon und das Modul sich darum kümmern.

                  Nein, lesen an sich ist nicht schwer - Für Deine Unterstützung bin ich Dir ja wirklich dankbar, allerdings scheinst Du mit dem Lesen auch so Deine Probleme zu haben, denn von "selber setzen" habe ich nie gesprochen.

                  Meine Frage war wie ich diese "abfragen" bzw. mir zurückgeben lassen kann. Denn wie Martin in seiner zweiten Antwort korrekterweise schrieb, muss ich im HTML-Code die CID (welche von Mime_Mail generiert wird) verwenden. Wenn ich der Methode keine eigene CID übergeben kann, muss ich diese stattdessen irgendwie abfragen/zurückgegeben bekommen, damit ich diese auch im HTML-Code verwenden kann - oder die Klasse müsste dies korrekterweise im Body überschreiben.

                  Sascha

                  1. Hi,

                    Für Deine Unterstützung bin ich Dir ja wirklich dankbar, allerdings scheinst Du mit dem Lesen auch so Deine Probleme zu haben, denn von "selber setzen" habe ich nie gesprochen.

                    Das ist aber genau das, was du in deinem gezeigten Beispielcode machst:

                    ... $html .= "<img src=\"cid:" . basename($image) . "\" style=\"width: 320px; height: 320px; border: none;\" width=\"320\" height=\"240\" border=\"0\" alt=\"\" />"; ...

                    Du versuchst selber eine cid:-Angabe da reinzupfuschen.

                    Meine Frage war wie ich diese "abfragen" bzw. mir zurückgeben lassen kann.

                    Brauchst du nicht ...

                    oder die Klasse müsste dies korrekterweise im Body überschreiben.

                    Und genau das tut sie ja offenbar auch, wenn man sie erst mal korrekt benutzt.

                    MfG ChrisB

                    --
                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                    1. Hallo Chris,

                      ich hatte Dich zunächst missverstanden, aber nun funktioniert es!

                      Vielen Dank für Deine Unterstützung!

                      Beste Grüße,
                      Sascha