bjoern: Multipart Emails mit Html UND Text verschicken

Hallo Forum!

Unter http://www.selfphp.de/funktionsreferenz/mail_funktionen/mail.php habe ich gesehen, dass es mit PHP möglich ist Emails im text und htmlformat gleichzeitig zu schicken.

Ich möchte also, dass wenn der E-Mail-Empfänger eine Emailsoftware wie z.B. Outlook benutzt die Html-Inhalte in einer Mail anzeigen kann, eine HTML-formatierte E-Mail bekommt.
Ein Empfänger, der mit einem textbasierten Programm (ohne Html-Unterstützung wie z.B. gmx.de, web.de, etc.) arbeitet soll nur einen Text erhällt.

Ich habe nun den Inhalt für die Html-Mail in der Variablen $inhalt_html und den Inhalt für die Text-Mail in $inhalt_text.

Meine Frage nun: Wie muss ich diese Variablen in die mail()-Funktion von PHP setzen und wie muss der header für eine Solche Multipart-Email aussehen??

Grüße
Björn

  1. Hi bjoern!

    Unter http://www.selfphp.de/funktionsreferenz/mail_funktionen/mail.php habe ich gesehen, dass es mit PHP möglich ist Emails im text und htmlformat gleichzeitig zu schicken.

    Nein.

    Da steht, dass es mit PHP möglich ist Emails im Text- _oder_ HTML-Format zu schicken.

    Was du für $message einsetzt, ist dabei egal.

    Wieso schickst du die Mails nicht im Textformat? Das kann jeder lesen und jeder ist damit zufrieden.

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
    1. Hallo Hopsel!

      Da steht, dass es mit PHP möglich ist Emails im Text- _oder_ HTML-Format zu schicken.

      Ich habe in den Header der Mail geschrieben: "Content-type: text/html", wodurch mir meine Mailsoftware den Inhalt der Variablen "$message" 2 mal anzeigt: Einmal Richtig, Im Rich-Text-Format (HTML) und dann einmal im Text-Format ohne jegliche Formatierungen.

      Es muss doch irgendwie zu steuern sein was er anzeigt. Wozu sonst die Contenttype Angabe im Header?? Sobald sie da ist, spuckt Outlook Express den Inhalt der Mail 2mal aus..

      Wieso schickst du die Mails nicht im Textformat? Das kann jeder lesen und jeder ist damit zufrieden.

      Habe in der Mail eine Tabelle, die ich mit Leerzeichen für die "Textversion" formatiert habe. Komischer Weise zeigt die Mailsoftware die Mail in einer Schriftart an, wo nicht alle Zeichen gleich viel Platz weg nehmen. Hierdurch verrutscht die Tabelle. Ich hätte also für diesen Fall gerne eine Html-Tabelle in der Mail oder aber die Html-Mail zwischen das <pre>-Tag gesetzt, wodurch der Inahlt auch vernünftig angezeigt wird..

      Wie ist es also möglich der Mailsoftware zu verklickern nur eine der beiden Versionen (Html ODER Text)?

      Gruß Björn

      1. Ich habe eine Software, die verschickt über meinen SMTP auch Multipart Mails. Funktioniert bestens.

        Eigentlich müsste es doch möglich sein die Anzeige dadurch zu steuern, was im Body der Mail direkt drin steht?

        Wie muss denn der Body der Mail gestaltet sein, wenn im Header der Mail Contenttyp text/html steht?

        Vielleicht einmal Komplettes Html-Gerüst für Html-Version und einmal vorab oder hintendran der Normale Text??

        Bei der Software kann man näml. sogar andere Inhalte für Html-Format und Textformat der Mail bestimmen.

        Müsste also möglich sein 2 Versionen der Mail bereitzustellen.
        Kann mir jemand sagen wie sowas geht???

        Gruß Björn.

    2. Hi!

      Nein.
      Da steht, dass es mit PHP möglich ist Emails im Text- _oder_ HTML-Format zu schicken.

      Dann hast du nicht richtig gelesen.
      Man kann mit PHP natürlich jede Art von Email verschicken. Zum einen kann man die mail()-Funktion einsetzen oder natürlich direkt auf einen installierten MTA (wie sendmail oder postfix) zugreifen und die Mail da abliefern.
      Aber wie auch immer: Die Mailfunktion hat selbst nichts mit dem Inhalt der Mail zu tun. Deswegen gibt es da auch keinen Parameter zum Verschicken von Text oder HTML. Man kann HTML, Text, multipart oder Mails mit Base64-codierten Anhängen verschicken.
      Man übergibt im Header einfach einen Content-Type und bastelt dann den Mailbody zusammen.
      Wenn man keine Ahnung hat, wie die Mail aussehen sollte, dann kann man sich auch einfach mal ein Beispiel anschauen. Jeder bekommt wohl Spammails. Viele von denen werden im multipart-Format verschickt.
      Man nimmt sich einfach so eine Mail und speichert sie als Textdatei ab. Da sieht man dann alles. Darüberhinaus bietet auch jeder brauchbare Mailclient (sogar Outlook - obwohl das ja nicht zu den brauchbaren Programmen zählt) die Möglichkeit, sich die Header bzw. den gesamten Quelltext der Mail anzusehen. Da sieht man dann die Header und den Mailbody.

      OK. Ich hole jetzt mal ein wenig aus, um das Ganze mit den Multipart-Mails zu erklären:

      Im Prinzip gibt es reine Textmails und HTML-Mails. Was hier verschickt werden soll, das sind multipart-Mails. Die enthalten einen HTML-Teil und einen Textteil.
      Der Mailclient des Users entscheidet dann, welcher Teil der Mail dann im Endeffekt angezeigt werden soll. Akzeptiert der Client HTML-Mails, dann wird der HTML-Teil gezeigt und sonst halt nur der reine Textteil.
      Damit wird der Nachteil des Ganzen dann auch schon sichtbar. Während eine HTML-Mail schon sinnlos durch die Tags aufgebläht wird, sind Multipart-Mails natürlich noch verschwenderischer, weil die Mail ja da im Prinzip zweimal enthalten ist.

      HTML-Mails verschickt man, indem man den Content-Type auf text/html setzt. Bei reinen Textmails wird dieser auf text/plain gesetzt.

      Bei einer Multipart-Mail gibt man als erstes mal den Content-Type an - wie bei einer Text- oder HTML-Mail auch.
      Hier lautet der aber multipart/mixed.

      $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n";

      $boundary enthält dann den Trenner, der die einzelnen Teile von einander trennt.
      Den kannst du z.B. so erstellen:
      $boundary = uniqid( "MULTIPARTDEMO" );

      Dann folgt der erste Teil, z.B. so:
      $body = "--$boundary\r\n" .
         "Content-Type: text/plain; charset=ISO-8859-1\r\n" .

      Dann kommt der Textteil und danach wird dann auf die gleiche Art und Weise der HTML-Teil angehängt (Content-Type: text/html).

      Im Übrigen hast Du dir im PHP-Handbuch bei der mail-Funktion nicht alles durchgelesen...
      Wenn man hier http://php3.de/manual/de/ref.mail.php unter der Funktionsbeschreibung ein wenig runterscrollt, dann findet man da in den Kommentaren auch ein Beispiel für Multipart-Mails.

      Wieso schickst du die Mails nicht im Textformat? Das kann jeder lesen und jeder ist damit zufrieden.

      Tja, kann man natürlich machen... Wäre auch mein favorisiertes Format. Aber wenn er nunmal die Mails so verschicken will, dann soll er auch eine Antwort bekommen, wie er das macht...
      Und obwohl ich selbst sowas auch nicht mag, verschicke ich auch desöfteren HTML-Mails. Was soll man denn auch sonst machen, wenn ein Kunde das wünscht?

      Schöner Gruß,
      rob

      1. Hallo Rob!

        OK. Ich hole jetzt mal ein wenig aus, um das Ganze mit den Multipart-Mails zu erklären:

        Vielen lieben Dank für deine Erklärung! Ich hatte weiter runtergescrollt und nach langem probieren rausgefunden, dass es so geht:

          
          $message_html ="Mein Inhalt für die HTML-Email.";  
          $message_text ="Mein Inhalt für die Text-Email.";  
          
          //Boundary:  
          $Trenner = md5(uniqid(time()));  
          // Mail-Header:  
          $headers .= "From:$vorname $name <$email>\n";  
          $headers .= "Return-Path: <$email>\n";  
          $headers .= "Content-Type: multipart/alternative; boundary=\"$Trenner\"\n\n";  
          $headers .= "MIME-Version: 1.0\n";  
          $headers .= "This is a multi-part message in MIME format\n";  
          $headers .= "--$Trenner\n";  
          // Text-Mail  
          $headers .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";  
          $headers .= "Content-Transfer-Encoding: quoted-printable\n\n";  
          $headers .= $message_text."\n";  
          $headers .= "--$Trenner\n";  
          // Html-Mail  
          $headers .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";  
          $headers .= "Content-Transfer-Encoding: quoted-printable\n\n";  
          $headers .= $message_html."\n";  
          //Ende und Versand der Mail  
          $headers .= "--$Trenner--";  
          mail("emailempfaenger@meinedomain.de", "Betreff meiner E-Mail", "", $headers);
        

        Hab mir die Struktur bei Outlook aus dem Quellcode einer Mail geklaut :)

        Hat suuuper geklappt^^
        Dankeschööön!

        Schöne Grüße Björn

  2. Moin!

    Ich möchte also, dass wenn der E-Mail-Empfänger eine Emailsoftware wie z.B. Outlook benutzt die Html-Inhalte in einer Mail anzeigen kann, eine HTML-formatierte E-Mail bekommt.
    Ein Empfänger, der mit einem textbasierten Programm (ohne Html-Unterstützung wie z.B. gmx.de, web.de, etc.) arbeitet soll nur einen Text erhällt.

    Es ist bei solchen Vorhaben ganz empfehlenswert, einfach eine vorgefertigte Klasse zu verwenden, die einem die ganzen aufwendigen Berechnungen und Konvertierungen abnimmt, und der man einfach nur noch den Text-, HTML- und ggf. Attachmentinhalt übergibt und sagt, wer die Mail alles erhalten soll.

    Meine Empfehlung zu diesem Problem: vlibMimeMail

    Diese Klasse kann ich sehr empfehlen, insbesondere auch in Zusammenarbeit mit vlibTemplate (weil man ja wahrscheinlich den Mailtext als Template vorhalten möchte, um ihn leichter bearbeiten zu können).

    - Sven Rautenberg

    --
    My sssignature, my preciousssss!