*jiriki*: HTML Mail von Outlook 2007 nur als "Nur-Text"-Mail erkannt

Versende ich eine automatisch generierte HTML-Mail durch dieses PHP-Script, wird eine Mail versand, die in Gmail, Web.de und einem Webinterface eines anderen Mailproviders richtig dargestellt wird.
In Outlook 2007 wird die "HTML-Mail"-Deklaration im Header bzw. Content ignoriert und "Nur-Text" ausgegeben: Die HTML-Tags werden nicht interpretiert. Zudem wird der letzte Header "Content-Type: multipart/related; boundary=0003255546b6117da7047a492fc7" als Textcontent mit ausgegeben. Verändere ich die Header-Reihenfolge, wird immer der letzte Header mit ausgegeben. Füge ich weitere Header hinzu, werden diese ebenfalls ausgegeben. Anders ausgedrückt werden immer die ersten beiden Header verdeckt, die anderen ausgegeben.

Quellcode:
---

  
$headers = "From: Alex <trash4valhalla@gmail.com>\r\n";  
$headers .= "MIME-Version: 1.0\r\n";  
$headers .= "Content-Type: multipart/related; boundary=0003255546b6117da7047a492fc7";  
  
$message = "  
--0003255546b6117da7047a492fc7\r\n  
  
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"  
 	\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">  
<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">  
<head>  
<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-1\" />  
<title></title>  
<style type=\"text/css\">  
<!--  
html, body {  
	font-family:arial,helvetica,tahoma,sans-serif;  
	font-size:12px;  
	background-color:#FFFFFF;  
	margin-top:0;  
	margin-bottom:0;  
	margin:0;  
	border:0;  
	outline:0;  
	padding:3px;  
	color:#333333;  
}  
-->  
</style>  
</head>  
<body>  
Servus Dude  
</body>  
</html>\r\n  
--0003255546b6117da7047a492fc7\r\n";  
  
$mailsent = mail("alex@email.com", "Testmail", $message, $headers);  

---

Ich wäre für jeden Hinweis dankbar, wie ich Outlook 2007 dazu bringe, die Mail als HTML-Mail zu erkennen.

Viele Grüße

  1. Hallo erstmal!

    Versende ich eine automatisch generierte HTML-Mail durch dieses PHP-Script, wird eine Mail versand, die in Gmail, Web.de und einem Webinterface eines anderen Mailproviders richtig dargestellt wird.
    In Outlook 2007 wird die "HTML-Mail"-Deklaration im Header bzw. Content ignoriert und "Nur-Text" ausgegeben: Die HTML-Tags werden nicht interpretiert. Zudem wird der letzte Header "Content-Type: multipart/related; boundary=0003255546b6117da7047a492fc7" als Textcontent mit ausgegeben. Verändere ich die Header-Reihenfolge, wird immer der letzte Header mit ausgegeben. Füge ich weitere Header hinzu, werden diese ebenfalls ausgegeben. Anders ausgedrückt werden immer die ersten beiden Header verdeckt, die anderen ausgegeben.

    Speichere bitte eine Mail, die Du mit Outlook 2007 vom Server abgeholt hast, als lokale Datei ab, lade sie auf Deinen Webspace hoch und gib den URL dazu hier bekannt, damit man die Header sich genau ansehen kann. Einige Fehler, insbesondere was Wahl und Umsetzung des Mediatyps der Mail betrifft, sind auch ersichtlich. Daher ist wichtig zu wissen, ob die Mail nur als HTML-Dokument gesendet werden soll, oder ob Du dazu einen alternativen Klartext ebenso in der Mail versenden willst und ob auch Bilder innerhalb des HTML-Dokumentes angezeigt werden sollen.

    Gruß aus Berlin!
    eddi

    1. Servus eddi,

      Speichere bitte eine Mail, die Du mit Outlook 2007 vom Server abgeholt hast, als lokale Datei ab, lade sie auf Deinen Webspace hoch und gib den URL dazu hier bekannt, damit man die Header sich genau ansehen kann. Einige Fehler, insbesondere was Wahl und Umsetzung des Mediatyps der Mail betrifft, sind auch ersichtlich. Daher ist wichtig zu wissen, ob die Mail nur als HTML-Dokument gesendet werden soll, oder ob Du dazu einen alternativen Klartext ebenso in der Mail versenden willst und ob auch Bilder innerhalb des HTML-Dokumentes angezeigt werden sollen.

      Also ich würde gerne eine HTML-Mail mit alternativem Klartext-Teil versenden. In die HTML-Mail soll zudem ein Header-Bild und ein Hintergrundbild eingebunden werden. Ich habe es nun immerhin geschafft, dass Outlook2007 die Mail als HTML-Mail erkennt. Neuer Quelltext hierzu ist:

      ---

        
      $headers = "MIME-Version: 1.0  
      Subject: Testmail  
      From: Alex <test@web.de>  
      Cc: Testomate <testomate@web.de>, Weihnachtswichtel <wichtel@gmail.com>  
      Content-Type: multipart/related; boundary=001636c59763ff4b2e047a4922b5";  
        
      $message = "  
      --001636c59763ff4b2e047a4922b5  
      Content-Type: multipart/alternative; boundary=001636c59763ff4b29047a4922b4  
        
      --001636c59763ff4b29047a4922b4  
      Content-Type: text/plain; charset=ISO-8859-1  
      Content-Transfer-Encoding: quoted-printable  
        
      Hey Dude,  
        
      Ecard für Dich: http://www.ecard.com.  
        
      Gr=FC=DFe, Alex  
        
      --001636c59763ff4b29047a4922b4  
      Content-Type: text/html; charset=ISO-8859-1  
      Content-Transfer-Encoding: quoted-printable  
        
      <b>Hey Dude,</b>  
      <p>Ecard für <a href=\"http://www.ecard.com\" target=\"_blank\">Dich</a>.</p>  
      Gr=FC=DFe, Alex  
        
      --001636c59763ff4b29047a4922b4--  
        
      --001636c59763ff4b2e047a4922b5--";  
        
      $mailsent = mail("tester@gmx.de", "Testmail", $message, $headers);  
      
      

      ---

      Was nun weder in Gmail noch in Outlook2007 funktioniert in der HTML-Version, ist der Link auf ecard.com. Witzigerweise steht im Quellcode der von Outlook abgerufenen Mail plötzlich: <a href=ttp://www.ecard.com" .. Kein Wunder, dass der Link nicht mehr funktioniert.

      Hättest du ein Beispieltemplate für eine funltionierende komplette HTML-Mail, die auch in Outlook2007 richtig angezeigt wird?

      Danke und Grüße

      1. Hi,

        Also ich würde gerne eine HTML-Mail mit alternativem Klartext-Teil versenden.

        hast du ja nun. :-)

        $message = "
        --001636c59763ff4b2e047a4922b5
        Content-Type: multipart/alternative; boundary=001636c59763ff4b29047a4922b4

        --001636c59763ff4b29047a4922b4
        Content-Type: text/plain; charset=ISO-8859-1
        Content-Transfer-Encoding: quoted-printable

        Ah, jetzt ist es besser, nun ist auch der Content-Type für die einzelnen Parts da. Und multipart/alternative für die Gesamtnachricht ist dann auch richtig, wenn die einzelnen Teile tatsächlich alternativ sind.

        <p>Ecard für <a href="http://www.ecard.com" target="_blank">Dich</a>.</p>
        Gr=FC=DFe, Alex

        Was nun weder in Gmail noch in Outlook2007 funktioniert in der HTML-Version, ist der Link auf ecard.com. Witzigerweise steht im Quellcode der von Outlook abgerufenen Mail plötzlich: <a href=ttp://www.ecard.com" .. Kein Wunder, dass der Link nicht mehr funktioniert.

        Richtig, kein Wunder. Du hast als Transfer-Encoding "quoted-printable" vereinbart, das heißt, alle Zeichen, die in ASCII nicht darstellbar sind, werden mit ihrem Hex-Code und einem vorangestellten Gleichheitszeichen dargestellt. Das hat natürlich zur Konsequenz, dass das "=" als Escape-Zeichen selbst auch escapet werden muss. Richtig wäre also:

        <a href="http://www.ecard.com" target=3D"_blank">Dich</a>

        Dann klappt's auch mit dem Nachb^WLink. ;-)

        Ach so, das mit dem eingebetteten Bild ...
        Ja, da brauchst du zunächst mal noch eine Verschachtelungsebene (schematisch):

        Content-Type: multipart/alternative;  boundary="boundary(1)"

        --boundary(1)
        Content-Type: text/plain

        (Text)

        --boundary(1)
        Content-Type: multipart/related; boundary="boundary(2)"

        --boundary(2)
           Content-Type: text/html

        (HTML)

        --boundary(2)
           Content-Type: image/*
           Content-ID: <image-identifier>

        (Bild, üblicherweise base64-codiert)

        --boundary(2)--

        --boundary(1)--

        Die Einrückung darf im Mail-Quelltext natürlich nicht sein (Header müssen am Zeilenanfang stehen); ich hab's hier nur gemacht, um die Verschachtelung besser zu zeigen. Beachte außerdem, dass du zwei verschiedene Boundaries brauchst.

        Das Bild bekommt dann einen frei wählbaren Identifier, wie oben angedeutet, und wird im HTML-Quellcode mit src="cid:image-identifier" referenziert.

        So long,
         Martin

        --
        Heutzutage gilt ein Mann schon dann als Gentleman, wenn er wenigstens die Zigarette aus dem Mund nimmt, bevor er eine Frau küsst.
          (Barbra Streisand, US-Schauspielerin)
        1. Hallo Martin,

          $message = "
          --001636c59763ff4b2e047a4922b5
          Content-Type: multipart/alternative; boundary=001636c59763ff4b29047a4922b4

          --001636c59763ff4b29047a4922b4
          Content-Type: text/plain; charset=ISO-8859-1
          Content-Transfer-Encoding: quoted-printable

          Ah, jetzt ist es besser, nun ist auch der Content-Type für die einzelnen Parts da. Und multipart/alternative für die Gesamtnachricht ist dann auch richtig, wenn die einzelnen Teile tatsächlich alternativ sind.

          Ohne es jetzt ausprobiert zu haben, habe ich bei der Reihenfolge der Schachtelung meine Bedenken, da die Bilder, die mitgesendet werden sollen, außerhalb des in sich abgeschlossenen Teils "multipart/alternative" liegen würden. In Deinem schematischen Beispiel hast Du es ja auch anders dargestellt.

          Gruß aus Berlin!
          eddi

          1. Hallo Eddi,

            Ah, jetzt ist es besser, nun ist auch der Content-Type für die einzelnen Parts da. Und multipart/alternative für die Gesamtnachricht ist dann auch richtig, wenn die einzelnen Teile tatsächlich alternativ sind.

            Ohne es jetzt ausprobiert zu haben, ...

            ich fürchte, du hast vor allem den Überblick verloren. ;-)
            Denn im zweiten Beispiel von jiriki sind noch gar keine Bilder inbegriffen, die hat er/sie sich erst für eine weitere Ausbaustufe gewünscht.

            habe ich bei der Reihenfolge der Schachtelung meine Bedenken, da die Bilder, die mitgesendet werden sollen, außerhalb des in sich abgeschlossenen Teils "multipart/alternative" liegen würden.

            Daher kann diese Beobachtung nur ein Fehlschluss sein.

            In Deinem schematischen Beispiel hast Du es ja auch anders dargestellt.

            Eben. Aber da ist das Bild, das sich zum HTML-Teil gesellt, noch ein neuer Schritt, der eine um eine Stufe komplexere Struktur (multipart/related als Sub-Part von multipart/alternative) erfordert, wie ich abschließend skizziert habe.

            Ciao,
             Martin

            --
            Der Bäcker schlägt die Fliegen tot
            Und macht daraus Rosinenbrot.
            1. Re:

              ich fürchte, du hast vor allem den Überblick verloren. ;-)

              Nein, Martin, lies Dir auf meine Frage hin, die umzusetzenden Vorstellungen durch. Es sollen Bilder im HTML angezeigt werden. Warum also nicht gleich darauf hinweisen, dass bereits der letztgepostete Ansatz fürs Vorhaben formal fehlerhaft ist?

              Gruß aus Berlin!
              eddi

      2. Re:

        Speichere bitte eine Mail, die Du mit Outlook 2007 vom Server abgeholt hast, als lokale Datei ab, lade sie auf Deinen Webspace hoch und gib den URL dazu hier bekannt, damit man die Header sich genau ansehen kann. Einige Fehler, insbesondere was Wahl und Umsetzung des Mediatyps der Mail betrifft, sind auch ersichtlich. Daher ist wichtig zu wissen, ob die Mail nur als HTML-Dokument gesendet werden soll, oder ob Du dazu einen alternativen Klartext ebenso in der Mail versenden willst und ob auch Bilder innerhalb des HTML-Dokumentes angezeigt werden sollen.

        Also ich würde gerne eine HTML-Mail mit alternativem Klartext-Teil versenden. In die HTML-Mail soll zudem ein Header-Bild und ein Hintergrundbild eingebunden werden.

        Einem anderem Fragenden habe ich dazu mal einiges geschrieben, um ihm die Zusammenhänge klar zu machen. Leider hat die Forumsmoderation den entsprechenden Teil, der Fehlerhaft war, nicht gelöscht sondern empfand es wohl für wichtiger, mich an anderer Stelle wegen meiner Schreibfehler aufziehen, sodass Du Dir aus den Beiträgen bitte nur </archiv/2009/9/t190865/#m1272394> und </archiv/2009/9/t190865/#m1272490> ansehen solltest, was etwas unübersichtlich geworden ist ;(. Da sind die für Dein Vorhaben wichtigen Zusammenhänge und wie Du später Bilder innerhalb des HTML-Teils referenzieren musst, erläutert.

        $headers = "MIME-Version: 1.0
        Subject: Testmail
        From: Alex test@web.de
        Cc: Testomate testomate@web.de, Weihnachtswichtel wichtel@gmail.com
        Content-Type: multipart/related; boundary=001636c59763ff4b2e047a4922b5";

        $message = "
        --001636c59763ff4b2e047a4922b5
        Content-Type: multipart/alternative; boundary=001636c59763ff4b29047a4922b4

        Die Mediatypen sind nach meiner Auffassung nicht korrekt verschachtelt. Was Du willst, ist entweder -Text- oder -HTML mit Bild-. Daraus ergibt sich folgende Struktur:

        • multipart/alternative
             |
             |- text/plain
             |
             - multipart/related        |        |- text/html        |        - image/gif

        --001636c59763ff4b29047a4922b4
        Content-Type: text/plain; charset=ISO-8859-1
        Content-Transfer-Encoding: quoted-printable

        Wenn Du das Transfer-Encoding weglässt, brauchst Du das HTML oder wie hier den Klartext nicht weiter anpassen.

        Gruß aus Berlin!
        eddi

  2. Hallo,

    Versende ich eine automatisch generierte HTML-Mail durch dieses PHP-Script, wird eine Mail versand, die in Gmail, Web.de und einem Webinterface eines anderen Mailproviders richtig dargestellt wird.

    aber vermutlich nur deshalb, weil innerhalb eines solchen Notzugangs über ein Webmail-Interface sowieso der Defaultkontext "HTML" gilt.

    In Outlook 2007 wird die "HTML-Mail"-Deklaration im Header bzw. Content ignoriert und "Nur-Text" ausgegeben:

    Du hast keine "HTML-Mail"-Deklaration, und für den *Inhalt* der Nachricht darf sich ein Mailclient nicht interessieren, um zu entscheiden, wie er darzustellen ist. Da muss ich Outlook ausnahmsweise Recht geben; das würde ein richtiger Mailclient auch nicht anders machen.
    Nur in einem Punkt macht Outlook anscheinend Unsinn: Nach dem von dir geposteten Quelltext dürften keine Headerzeilen als Nachrichtentext ausgegeben werden, es sei denn, du hast irrtümlich eine Headerzeile mit *zwei* Zeilenumbrüchen abgeschlossen.

    Quellcode:

    Wenn das der vollständige Quellcode ist, mit dem die Nachricht generiert wird, dann ist die resultierende Nachricht tatsächlich fehlerhaft.

    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: multipart/related; boundary=0003255546b6117da7047a492fc7";

    Wieso deklarierst du die Mailnachricht als multipart/*, wenn sie dann doch nur aus *einem* Teil besteht? Der MIME-Type multipart/related bedeutet, dass die Nachricht mehrere Teile enthält ("multipart"), die miteinander in Beziehung stehen ("related"). Es ist kein Verstoß gegen die Regeln, eine multipart-Nachricht mit nur einem Teil zu generieren, aber er ist sinnlos.

    $message = "
    --0003255546b6117da7047a492fc7\r\n

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

    Stop, stop! Wo bleiben die Header für diesen Part? Da fehlt mindestens ein "Content-Type: text/html" plus Angabe der Zeichencodierung.

    --0003255546b6117da7047a492fc7\r\n";

    Und der letzte Trenner wird am Zeilenende mit zwei zusätzlichen Minuszeichen "--" ergänzt.

    Ich wäre für jeden Hinweis dankbar, wie ich Outlook 2007 dazu bringe, die Mail als HTML-Mail zu erkennen.

    Das Wichtigste ist der Content-Type-Header, der den Nachrichteninhalt als HTML ausweist.

    So long,
     Martin

    --
    Ja, ja ... E.T. wusste schon, warum er wieder nach Hause wollte.