verona: Problem mit der mail()-Funktion

Hallo liebes Forum,

nachdem ich mich jetzt eine Weile mit MIME Mails und PHP beschäftigt haben, finde ich immer noch keine Lösung für mein Problem. Ich habe viele Seiten gefunden, aber alle bringen mir nicht wirklich einen Antwort. Also versuche ich es mal hier.
Ich benutzte die PHP-Funktion mail(), die wie folgt aufgebaut ist:

mail($empfaengeradresse,$betreff,$nachricht,$headers);

Gleich mal vorneweg. Ich versuche mich in multipart/-Mails und da habe ich schon ein Verständnisproblem. Mit dem Aufbau der Funktion mail() bin ich doch irgendwann gezwungen einen Teil der Nachricht in den $headers zu schreiben oder einen Teil der Headers in $nachricht, oder?! Ich hoffe ihr versteht.

$headers -> z.B. Content Type multipart/alternative
$headers -> z.B. text/plain
$nachricht -> Hallo blablabla
$headers -> z.B. text/html
$nachricht -> <b>Hallo blablabla</b>

Wie geht es denn richtig? Meine Mails, die ich damit sende, zeigen mir immer den HTML-Teil als plain, also mit allen Tags.

Gruß Vero

  1. Hi,

    Ich versuche mich in multipart/-Mails und da habe ich schon ein Verständnisproblem. Mit dem Aufbau der Funktion mail() bin ich doch irgendwann gezwungen einen Teil der Nachricht in den $headers zu schreiben oder einen Teil der Headers in $nachricht, oder?!

    nein. Es gibt nur einen Header, welcher sagt, dass der Body der Mail, also die eigentliche Nachricht, vom Client so interpretiert werden soll, dass dort weitere Header stehen. Diese stehen jedoch schlicht und ergreifend innerhalb von $nachricht.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo Cheatah,

      dann sollte das doch eigentlich stimmen, oder?

      $boundary_mixed = "ME-" . strtoupper(md5(uniqid(time())));
       $boundary_related = "ME-" . strtoupper(md5(uniqid(time())));
       $boundary_alternative = "ME-" . strtoupper(md5(uniqid(time())));

      $headers  = "From: "".addslashes($absendername)."" <".$absendermail.">\r\n";
       $headers .= "Reply-To: ".$absendermail."\r\n";
       $headers .= "MIME-Version: 1.0\r\n";
       $headers .= "X-Priority: 3\r\n";
       $headers .= "X-Mailer: PHP Mailskript / ".phpversion()."\r\n";
       $headers .= "Content-Type: multipart/mixed; boundary="" . $boundary_mixed . ""\r\n";
       $headers .= "Content-Transfer-Encoding: 7bit\r\n";
       $headers .= "Diesen Teil der E-Mail sollten Sie nicht sehen.\r\n";
       $headers .= "Wenn Sie das hier lesen, sollten Sie Ihren E-Mail-Client\r\n";
       $headers .= "in einen MIME-kompatiblen E-Mail-Client tauschen.\r\n";
       $headers .= "\r\n";
       $headers .= "This part of the E-mail should never be seen.\r\n";
       $headers .= "If you are reading this, consider upgrading your e-mail client\r\n";
       $headers .= "to a MIME-compatible e-mail client.\r\n";
       $headers .= "--" . $boundary_mixed . "\r\n";

      // $nachricht  = "Content-Type: multipart/related; boundary="" . $boundary_related . ""\r\n";
      // $nachricht .= "--" . $boundary_related . "\r\n";
       $nachricht = "Content-Type: multipart/alternative; boundary="" . $boundary_alternative . ""\r\n";
       $nachricht .= "--" . $boundary_alternative . "\r\n";
       $nachricht .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
       $nachricht .= "Content-Transfer-Encoding: quoted-printable\r\n";
       $nachricht .= join('',file($vorlage_text));
       $nachricht .= "--" . $boundary_alternative . "\r\n";
       $nachricht .= "Content-Type: text/html; charset=iso-8859-1\r\n";
       $nachricht .= "Content-Transfer-Encoding: 8bit\r\n";
       $nachricht .= join('',file($vorlage_html));
       $nachricht .= "--" . $boundary_alternative . "--\r\n";
      // $nachricht .= "--" . $boundary_related . "\r\n";
      // $nachricht .= "Content-Type: image/jpeg\r\n";
      // $nachricht .= "Content-Transfer-Encoding: base64\r\n";
      // $nachricht .= "0.gif";
      // $nachricht .= "--" . $boundary_related . "--\r\n";
       $nachricht .= "--" . $boundary_mixed . "--\r\n";

      mail($empfaengermail,$betreff,$nachricht,$headers);

      Tut es aber nicht. Der HTML-Teil wird immer mit allen TAGS gezeigt, und ein Teil des Text-Teil vorneweg?! Verstehe ich nicht.

      1. Hi,

        dann sollte das doch eigentlich stimmen, oder?

        in welchen Mail-Clients liefert es die gewünschten Ergebnisse?

        $headers .= "Diesen Teil der E-Mail sollten Sie nicht sehen.\r\n";

        Das ist kein gültiger Mail-Header.

        $headers .= "Wenn Sie das hier lesen, sollten Sie Ihren E-Mail-Client\r\n";
        $headers .= "in einen MIME-kompatiblen E-Mail-Client tauschen.\r\n";

        Nein. Es wäre völlig korrekt, wenn der Mail-Client dies im Zusammenhang mit einer Fehlermeldung anzeigt.

        $headers .= "\r\n";

        Spätestens hiermit ist die Variable $headers der falsche Ort.

        $headers .= "This part of the E-mail should never be seen.\r\n";

        Dies ist bereits Teil des Bodies.

        Tut es aber nicht. Der HTML-Teil wird immer mit allen TAGS gezeigt, und ein Teil des Text-Teil vorneweg?! Verstehe ich nicht.

        Warum benutzt Du unterschiedliche Boundaries?

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Das ist jetzt das bereinigte Skript. Aber alles was ich geliefert bekomme ist Müll. Die Mail beginnt mit einer Leerzeile und liefert dann das hier.

          Content-Type: text/plain; charset=iso-8859-1
          Content-Transfer-Encoding: quoted-printable
          Dann den Inhalt von $vorlage_text
          text- Aber Hallo
          Den Inhalt von $boundary

          usw...

          _____________________________________________________________________________________________
          $boundary = "ME-" . strtoupper(md5(uniqid(time())));

          $headers  = "From: "".addslashes($absendername)."" <".$absendermail.">\r\n";
          $headers .= "Reply-To: ".$absendermail."\r\n";
          $headers .= "MIME-Version: 1.0\r\n";
          $headers .= "X-Priority: 3\r\n";
          $headers .= "X-Mailer: PHP Mailskript / " . phpversion() . "\r\n";
          $headers .= "Content-Type: multipart/alternative; boundary="" . $boundary . ""\r\n";
          $headers .= "--" . $boundary . "\r\n";

          $nachricht .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
          $nachricht .= "Content-Transfer-Encoding: quoted-printable\r\n";
          $nachricht .= join('',file($vorlage_text));
          $nachricht .= "text- Aber Hallo";
          $nachricht .= "--" . $boundary . "\r\n";
          $nachricht .= "Content-Type: text/html; charset=iso-8859-1\r\n";
          $nachricht .= "Content-Transfer-Encoding: 8bit\r\n";
          $nachricht .= join('',file($vorlage_html));
          $nachricht .= "HTML <b>Aber Hallo<b>";
          $nachricht .= "--" . $boundary . "--\r\n";

          mail($empfaengermail,$betreff,$nachricht,$headers);

          1. Hi,

            Aber alles was ich geliefert bekomme ist Müll.

            vergleiche den Quellcode(!) der von Dir generierten Mail mit einer ähnlichen, die von einem anderen Programm generiert wurde und die gewünschten Ergebnisse liefert. Versuche (erst) dann herauszufinden, wo der Fehler in Deinem PHP-Code liegt.

            Cheatah

            --
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Wie komme ich denn an so einen Quellcode?

              1. Halihallo verona

                Wie komme ich denn an so einen Quellcode?

                http://forum.de.selfhtml.org/archiv/2003/5/46481/#m253584, warum erst jetzt das
                Interesse? - Nun gut...

                (Fast) jeder Mailclient hat eine Funktion "Quelltext ansehen" oder ähnlich. Welchen du
                benutzt hast du uns nicht mitgeteilt, somit auch keine hilfreiche Antwort.

                Viele Grüsse

                Philipp

                1. Ach Phillip,

                  darum geht es doch gar nicht. Welcher Mail-Client? Das ist doch zweitrangig. Das erste mal hatte ich noch versucht einen Anhang an die Mail zu hängen. Das ist erledigt. Und um Deine Frage mit dem Client zu beantworten. Alle, die es gibt. Outlook, Outlook Express, Tobit, David, Netscape, TheBat, und und und...

                  Und den Quellcode den ich sehe, ist der einer HTML-Seite. Bei Outlook kann ich mir unter den Options aber noch den Head anschauen. Soll ich den auch mal schicken?

                  Return-Path: user@domain.tld
                  Delivered-To: empfaenger@domain.tld
                  Received: (qmail 8445 invoked from network); 15 May 2003 10:54:00 -0000
                  Received: from unknown (HELO aurora.ispgateway.de) ([62.67.200.30]) (envelope-sender user@domain.tld)
                            by sleet.ispgateway.de (qmail-ldap-1.03) with SMTP
                            for empfaenger@domain.tld; 15 May 2003 10:54:00 -0000
                  Received: (qmail 30125 invoked by uid 0); 15 May 2003 10:54:00 -0000
                  Received: from unknown (HELO aurora.ispgateway.de) (127.0.0.1)
                    by localhost with SMTP; 15 May 2003 10:54:00 -0000
                  Received: (from u12345@localhost)
                   by aurora.ispgateway.de (8.12.8/8.12.8/Submit) id h4FArvsG030118;
                   Thu, 15 May 2003 12:53:57 +0200
                  Date: Thu, 15 May 2003 12:53:57 +0200
                  Message-Id: 200305151011.h4FArvsG030118@aurora.ispgateway.de
                  To: empfaenger@domain.tld
                  Subject: Betreff newsletter
                  From: "Firma 1" absender@domain.tld
                  Reply-To: absender@domain.tld
                  MIME-Version: 1.0
                  X-Priority: 3
                  X-Mailer: PHP Mailskript / 4.2.3
                  Content-Type: multipart/alternative; boundary="------------ME-F54D9F74915FA8E4E3FD9EAD22DE92C2"

                  Was mich hierbei wundert, ist der Unterschied zwischen user@domain.tld und absender@domain.tld! Woher kommt bitteschön denn der user@domain.tld? Den habe ich nicht angegeben. Kommt wohl vom ISP, was?

                  1. Halihallo verona

                    darum geht es doch gar nicht. Welcher Mail-Client? Das ist doch zweitrangig.

                    Ja, es ist zweitrangig, deshalb habe ich dir die Wahl überlassen.
                    Es geht mir und wohl auch Cheatah darum, dass du dir selber eine E-Mail des gewünschten
                    Formates zusendest und dann den Quelltext ansiehst. Denn wenn du dies tust, weisst du,
                    wie es in PHP umgesetzt werden muss, andernfalls wäre ich natürlich der letzte, der dich
                    vom RFC-lesen abhält.

                    Und den Quellcode den ich sehe, ist der einer HTML-Seite. Bei Outlook kann ich mir unter den Options aber noch den Head anschauen. Soll ich den auch mal schicken?

                    Du musst deinen Mailclient veranlassen den _gesamten_ Quelltext anzuzeigen. Mit Outlook
                    Express geht dies über Eigenschaften->Details->Quelltext. Dort siehst du, was man dem
                    Mailclient geben muss, sodass er das Mail so darstellt, wie du es möchtest.

                    Was mich hierbei wundert, ist der Unterschied zwischen user@domain.tld und absender@domain.tld! Woher kommt bitteschön denn der user@domain.tld? Den habe ich nicht angegeben. Kommt wohl vom ISP, was?

                    Möglich. Return-Path ist oftmals gleich des From-Headers. Er spezifiziert lediglich die
                    Empfängeradresse, wenn das E-Mail z. B. nicht zugestellt werden kann. Aber das der ISP
                    da etwas ändert glaube ich weniger.

                    Viele Grüsse

                    Philipp

                    1. Hallo Phillip,

                      danke nochmals. Nächste Woche kommt ein Bekannter und zeigt mir das anhand von Javaklassen. Hab nie was damit zu tun gehabt, aber MIME ist MIME, was?! :-)

                      Vero

  2. Hallo Verona,

    Warum machst Du Dir das Leben eigentlich schwer? Es gibt der PEAR-Klasse Mail_Mime, die das Behandeln von MIME-Mails Dir abnimmt:

    http://pear.php.net/manual/de/core.mail.mime.php

    Viele Grüße,
    Christian