Markus: Korrekter Content-Type für Multipart-Mail mit Inline-Images

Hallo zusammen.

Mittels PHP möchte ich eine Multipart-Mail mit Inline-Images versenden. Leider schaffe ich es momentan nur, daß entweder Googlemail oder Outlook (Version 2007) die Nachricht korrekt darstellen.

Content-Type: multipart/related; boundary=XXXXXXXX
Führt dazu, daß Outlook alles korrekt darstellt, Googlemail das Inline-Image sowie die HTML-Message jedoch als Attachments anzeigt.

Content-Type: multipart/multipart/alternative; boundary=XXXXXXXX
Führt dazu, daß Outlook das Inline-Image sowie die HTML-Message als Attachments anzeigt, Googlemail die Nachricht jedoch korrekt anzeigt.

Andere Webmailer oder Mailclients habe ich noch nicht geprüft, da mir dieses Problem überhaupt erst durch Googlemail aufgeallen ist.

Anbei eine komplette Nachricht inklusive aller Header. Weiß jemand weiter?!

Vorab vielen Dank für Eure Unterstützung!

<?php  
// Boundary / CID  
$boundary = md5(uniqid(rand(), true));  
$cid = md5(uniqid(rand(), true));  
// Header  
$msg .= "From: XXXXXXXX <XXXXXXXX@XXXXXXXX.com>\r\n";  
$msg .= "Reply-To: XXXXXXXX <XXXXXXXX@XXXXXXXX.com>\r\n";  
$msg .= "X-Mailer: PHP5.2.5\r\n";  
$msg .= "X-Sent-By-Ip: XXX.XXX.XXX.XXX\r\n";  
$msg .= "X-Priority: 0\r\n";  
$msg .= "MIME-Version: 1.0\r\n";  
$msg .= "Content-Type: multipart/alternative; boundary=\"" . $boundary . "\"\r\n";  
// Plain  
$msg .= "--" . $boundary . "\r\n";  
$msg .= "Content-Type: text/plain; charset=\"utf-8\"\n";  
$msg .= "Content-Transfer-Encoding: 8bit\r\n";  
$msg .= "Plain Text Mail\n\n";  
// Html  
$msg .= "--" . $boundary . "\n";  
$msg .= "Content-Type: text/html; charset=\"utf-8\"\n";  
$msg .= "Content-Transfer-Encoding: 8bit\r\n";  
$msg .= "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";  
$msg .= "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"de-DE\">\n";  
$msg .= "<head>\n";  
$msg .= "<meta http-equiv=\"pragma\" content=\"no-cache\" />\n";  
$msg .= "<meta http-equiv=\"cache-control\" content=\"no-cache\" />\n";  
$msg .= "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n";  
$msg .= "<meta http-equiv=\"content-style-type\" content=\"text/css\" />\n";  
$msg .= "<meta http-equiv=\"content-script-type\" content=\"text/javascript\" />\n";  
$msg .= "</head>\n";  
$msg .= "<body>\n";  
$msg .= "  <img src=\"cid:" . $cid . "\" width=\"128\" height=\"64\" alt=\"\" />\n";  
$msg .= "</body>\n";  
$msg .= "</html>\n\n";  
// Image  
$msg .= "--" . $boundary . "\n";  
$msg .= "Content-Type: application/octetstream; name=" . $cid . "\n";  
$msg .= "Content-Transfer-Encoding: base64\n";  
$msg .= "Content-ID: <" . $cid . ">\n";  
$msg .= "Content-Disposition:inline; filename=" . $cid . "\n\n";  
$msg .= chunk_split(base64_encode(file_get_contents('XXXXXXXX'))) . "\n\n";  
$msg .= "--" . $boundary . "--\n";  
?>

Beste Grüße,
Markus

  1. Hallöchen,

    Meines Wissens ist in solchen Fällen vor dem boundary "Content-type: multipart/mixed;" anzugeben.

    Und für JEDEN Part sollte es einen Content-Disposition: Eintrag geben.

    MfG
    vaudi

    1. Hallo Vaudi.

      Vielen Dank für Deine Hinweise. Die Content-Disposition habe ich nun in alle Blöcke eingefügt (Content-Disposition:inline - richtig?). Was ich vergessen hatte zu erwähnen - Content-Type: multipart/mixed hatte ich bereits versucht, führt jedoch dazu, daß Plain-Text-Message und HTML-Message in Outlook als Attachment angefügt werden und bei Googlemail zusammen in einer Nachricht angezeigt werden.  Auch mit anderen Content-Types funktioniert es nun trotz des Content-Dispositions Block nicht.

      Hast Du vielleicht noch eine Idee? :-)

      Vielen Dank und beste Grüße,
      Markus

      Hallöchen,

      Meines Wissens ist in solchen Fällen vor dem boundary "Content-type: multipart/mixed;" anzugeben.

      Und für JEDEN Part sollte es einen Content-Disposition: Eintrag geben.

      MfG
      vaudi

      1. Gelöst. Es lag an Zeilenumbrüchen.

        Sollte jemand das gleiche Problem haben, empfehle ich "MIMEMailxPHP4 V2 von Rainer Feike" (sicherlich auch in aktuellerer Version verfügbar)...

        Beste Grüße,
        Markus

        1. Hallöchen,

          Gelöst. Es lag an Zeilenumbrüchen.

          Sollte jemand das gleiche Problem haben, empfehle ich "MIMEMailxPHP4 V2 von Rainer Feike" (sicherlich auch in aktuellerer Version verfügbar)...

          Beste Grüße,
          Markus

          Da hat sich meine letzte Antwort wohl schon erübrigt ;)

          MfG
          vaudi

      2. Hallöchen,

        Hast Du vielleicht noch eine Idee? :-)

        Ja. Erstelle mal so eine Email, wie du sie haben willst, mit deinen Email-Programmen und schicke sie dir selbst. Dann speicherst du die empfangenen Emails als *.eml ab. Das, was jetzt über deinen Code ankommst, speicherst du nach dem Empfang ebenfalls als *.eml ab. Dann öffnest du die eml's mit einem Texteditor und vergleichst sie.

        Beachte dabei besonders, wo Leerzeilen sind. Und checke mal deinen Quellcode bezüglich der Zeilenumbrüche. Du hast teilweise \r\n, dann mal wieder nur \n.

        MfG
        vaudi