Andi: Email mit Anhang und eingebetteten Bildern

Hallo!

Es tut mir leid, dass ich euch noch einmal belästigen muss, aber ich verstehe nicht, wieso diese Email nicht funktioniert:

$mail_header = "";

$boundary = strtoupper(md5(uniqid(time())));

/* Beginne den Mail-Header mit MIME-Mail-Header */
$mail_header .= "MIME-Version: 1.0\r\n";
$mail_header .= "Content-Type: multipart/related; boundary="$boundary";\r\n\r\n";

/* Hier faengt der normale Mail-Text an */
$mail_header .= "--$boundary\r\n";
$mail_header .= "Content-Type: text/html;\r\n";
$mail_header .= "Content-Transfer-Encoding: 8bit\r\n\r\n";
$mail_header .= "<hmtl><body>Das ist eine Email mit Anhang <img src=3D"cid:1"></body></html>\r\n\r\n";

/* Hier faengt der Datei-Anhang an */
$mail_header .= "--$boundary\r\n";
$mail_header .= "Content-Type: image/jpeg; name="test.jpg";\r\n";
$mail_header .= "Content-Transfer-Encoding: base64\r\n";
$mail_header .= "Content-ID: <1>\r\n";

$file = "../upload/08D28658793748CDBD1F3FC930FE14BB/2F4901007EA6369B474AAF177C147B6F/5BAE12FDB6AAB5DE6BE0AD6BCB75114E_TN.jpg";
$handle = fopen($file, "r");
$attach_content = fread($handle, filesize($file));
fclose($handle);
$reply = chunk_split(base64_encode($attach_content),76,"\n");
$mail_header .= $reply."\r\n";
$mail_header .= "--$boundary--\r\n";

$mail_header .= "--$boundary\r\n";
$mail_header .= "Content-Type: application/x-httpd-php; name="test.phtml";\r\n";

$mail_header .= "Content-Transfer-Encoding: base64\r\n";
$mail_header .= "Content-Disposition: attachment\r\n\r\n";
$file = "../admin/DictionaryDE.phtml";
$handle = fopen($file, "r");
$attach_content = fread($handle, filesize($file));
fclose($handle);
$reply = chunk_split(base64_encode($attach_content),76,"\n");

$mail_header .= $reply."\r\n";
$mail_header .= "--$boundary--\r\n";

mail("Kael@steuefr.org","Ja eine Email","",$mail_header);

Ich werde schon zu blöd sein.

Grüße
Andi

  1. Hello,

    ich würde mal raten, weil Du nur eine Boundary definiert hast, aber nun kein angereihtes Format mehr hast, sondern ein geschachteltes und da muss man für jede Schatelung eine eigene Boundary definieren.

    Außerdem hast Du wieder nicht konsequrnt die Leerzeilen vor dem Subcontent berücksichtigt.

    Hoffe, dass ich Dir beim schnellen Überfliegen nun nicht Unrecht tue, aber das kreige ich dann ja gleich zurück *gg*

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  2. Hello,

    nochmal ein Tip am Rande:
    Um das Ganze übersichtlicher zu gestalten, trenne den Aufbau von $mail_header von der Berechnung der Daten. Die kannst Du vorweg beschaffen und formatieren und sie dann nur noch einfügen.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  3. Hello,

    $mail_header .= "Content-Type: multipart/related; boundary="$boundary";\r\n\r\n";

    related hat einen Kopf-Teil, der den Relationsgeber enthält und einen Datenteil, der die relateten Elemente enthält. Da können keine Attachments drin enthalten sein.

    Du müsstest dafür die Typen mulitpart/mixed und multipart/relatetd schachteln.

    +--Multipart/mixed---------------
      |
      |  this is a mime mail
      |
      |
      +--------------------------------
      |+---multipart/related-----------
      ||
      || html-Text
      ||
      ||
      |+-------------------------------
      ||
      || CID1
      |+------------------------------
      ||
      || CID 2
      |+================================
      |
      +---------------------------------
      | Attachment 1
      |
      +---------------------------------
      | Attachment 2
      |
      +=================================

    So müsste das aussehehn. Wenn Du auch noch HTML und Plain-Text alternativ anbeiten willst,
    muss da noch ein Subtype multipart/alternative rein. dann wirds aber echt kompliziert

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hallo!

      Habe es jetzt nur mal mit den eingebetteten Bildern versucht aber ich weiß auch nicht weiter:

      $mail_header = "";

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

      /* Beginne den Mail-Header mit MIME-Mail-Header */
      /* (siehe http://www.php3-forum.de/mime_mail.htm) */
      $mail_header = "";
      $mail_header .= "From: Walter TelserWalter@Telser.org\n";
      $mail_header .= "Reply-To: Walter@Telser.org\n";
      $mail_header .= "MIME-Version: 1.0\n";
      $mail_header .= "Content-Type: multipart/related;  boundary="$boundary"\n";
      $mail_header .= "X-Sender: Walte TelserWalter@Telser.org\n";
      $mail_header .= "X-Mailer: 4.7.3\n";
      $mail_header .= "X-Priority: 3\n";
      $mail_header .= "Return-Path: Walter@Telser.org\n";
      $mail_header .= "This is  a multi-part message in MIME format.\n";
      $mail_header .= "$boundary\n";
      $mail_header .= "Content-Type: multipart/alternative; boundary="$boundary_part"\n";

      /* Hier faengt der normale Mail-Text an */
      $message = "";
      $message .= "$boundary_part\n";
      $message .= "Content-Type: text/html;\n charset="utf8"\n";
      $message .= "Content-Transfer-Encoding: quoted-printable\n";
      $message .= "\n";
      $message .= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n";
      $message .= "<hmtl><body>Das ist eine Email mit Anhang <img src=3D"cid:1"></body></html>\n";
      $message .= "\n";
      $message .= "$boundary_part--\n";
      $message .= "\n";

      $file = "../upload/08D28658793748CDBD1F3FC930FE14BB/2F4901007EA6369B474AAF177C147B6F/5BAE12FDB6AAB5DE6BE0AD6BCB75114E_TN.jpg";
      $handle = fopen($file, "r");
      $attach_content = fread($handle, filesize($file));
      fclose($handle);
      $attach_content = chunk_split(base64_encode($attach_content),75,"\n");

      /* Hier faengt der Datei-Anhang an */
      $message .= "$boundary\n";
      $message .= "Content-Type: image/jpeg; \n name="test.jpg"\n";
      $message .= "Content-Transfer-Encoding: base64\n";
      $message .= "Content-ID: <1>\n";
      $message .= "\n";
      $message .= "$attach_content\n";
      $message .= "$boundary\n";

      und dann das ganze verschickt

      Grüße
      Andi

      1. Hello,

        $mail_header = "";

        $b1 = "--b1--".strtoupper(md5(uniqid(time())));

        /* Beginne den Mail-Header mit MIME-Mail-Header */
        /* (siehe http://www.php3-forum.de/mime_mail.htm) */

        $mail_header = "";
        $mail_header .= "From: Walter TelserWalter@Telser.org\r\n";
        $mail_header .= "Reply-To: Walter@Telser.org\r\n";
        $mail_header .= "MIME-Version: 1.0\r\n";
        $mail_header .= "Content-Type: multipart/related;  boundary="$b1"\r\n";
        $mail_header .= "X-Sender: Walte TelserWalter@Telser.org\r\n";
        $mail_header .= "X-Mailer: 4.7.3\r\n";
        $mail_header .= "X-Priority: 3\r\n";
        $mail_header .= "Return-Path: Walter@Telser.org\r\n\r\n";

        hier beginnt der normale Mailbody der Plaintext-Mail

        $mail_header .= "This is  a multi-part message in MIME format.\r\n";
        $mail_header .= "\r\n$b1\r\n\r\n";

        hier kommt nun der Kopf vom Mime-Part 1

        $message = "";
        $message .= "Content-Type: text/html;\n charset="utf8"\r\n";
        $message .= "Content-Transfer-Encoding: quoted-printable\r\n";
        $message .= "\r\n";
        $message .= "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n";  ###???
        $message .= "<hmtl><body>Das ist eine Email mit Anhang <img src=3D"cid:1"></body></html>\n"; ####???
        $message .= "\r\n";
        $message .= "$b1\r\n";
        $message .= "\r\n";

        $file = "../upload/08D28658793748CDBD1F3FC930FE14BB/2F4901007EA6369B474AAF177C147B6F/5BAE12FDB6AAB5DE6BE0AD6BCB75114E_TN.jpg";
        $handle = fopen($file, "r");
        $attach_content = fread($handle, filesize($file));
        fclose($handle);
        $attach_content = chunk_split(base64_encode($attach_content),75,"\n");

        $message .= "Content-Type: image/jpeg; \r\n";

        $message .=  "\tname="test.jpg"\r\n";

        $message .= "Content-Transfer-Encoding: base64\r\n";
        $message .= "Content-ID: <1>\r\n";
        $message .= "\r\n";
        $message .= "$attach_content";
        $message .= "\r\n$boundary--\r\n";    ## Endemarke nicht vergessen

        Und dann mail($to,$subject,'',$mail_header.$message);

        Nun hast Du wieder nur eine multipart/related-Mail

        da reicht eine Boundary

        Das gekapsel macht man ja nur, wenn man verschiedene Typen kombinieren muss.

        Vergleich erstmal Deine und meine Version.
        Dann sortier auf jeden Fall nochmal. Mitte in der Definition des Bodys sollte man keine Fileoperationen mehr durchführen.

        Das kannst Du dank Arrays alles vorher erledigen. Sonst kommst Du durcheinander.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hallo, Tom!

          Nun klappts!

          Danke für deine Mühe, wenn du mal was brauchst maile mir!

          Grüße
          Andi

          1. Hello,

            Nun klappts!

            sind aber noch ein paar unreimtheiten drin.
            Ich würde HTML-Teile immer in base64 versenden. Das hält mich nämlich davon ab, quoted-printable zu Fuß zu bauen ;-)) Soll heißen, lass es berechnen und bau es nicht selbst. da kommen nur Fehler rein. Die "\n" sind da nämlich nicht unbedingt richtig.

            Und die Leerzeile innerhalb eines Boundary-Blockes VOR der Angabe des Content-Type darf (oder muss?) eigentlich auch mal überprüft werden. Es geht auch ohne. Nach den Sub-Headern MUSS wieder ien Leerzeile stehen, bevor die Daten kommen.

            Danke für deine Mühe, wenn du mal was brauchst maile mir!

            Kommt darauf an, ob Du schon voll fit bist mit OOP unter PHP 5.0.0.
            Da muss ich jetzt dringend Sicherheit gewinnen.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            1. Hallo,

              unter PHP 5.0.0 hab ich mir noch nicht angeschaut. Kann aber sehr gut java und delphi programmieren.

              Glaube, dass da nicht viele Unterschiede sind.

              Grüße
              Andi

              1. Hello,

                unter PHP 5.0.0 hab ich mir noch nicht angeschaut. Kann aber sehr gut java und delphi programmieren.

                Glaube, dass da nicht viele Unterschiede sind.

                Java finde ich chaotisch. Aber das ist wohl Geschmackssache.

                PHP 5.0.0. OOP ist richtig geil geworden. Aber über ein paar Tests bin ich mit meinen Fitnessübungen leider noch nicht raus gekommen.

                Harzliche Grüße aus http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                1. Hallo,

                  habe mir PHP 5.0.0 noch nicht angeschaut, weil der Mapserver mit PHP 5 noch nicht läuft.

                  Grüße
                  Andi

                2. Hallo!

                  Ich verstehe nicht, wie man die kombinieren kann?

                  Kannst du kein Beispiel machen?

                  Grüße
                  Andi

        2. Hallo!

          Ich verstehe nicht, wie man die kombinieren kann?

          Kannst du kein Beispiel machen?

          Grüße
          Andi

          1. Hello,

            Ich verstehe nicht, wie man die kombinieren kann?

            habe ich Dir doch schon gemalt.
            Und wie es praktisch aussieht, da frag doch einfach mal Outlook Express. Lass Dir eine Mustermail zusammenbauen. Subtypes (speziell alternative) werden angemeldet als

            Content-Type: Haupttyp;
                 type='subtyp';
                 boundary='$b1';

            --boundary
              Content-Type: multipart/alternative;
                 boundary='$b3';

            hier der palin-Text-Teil

            $b3;
              Content-Type: Type2

            Inhalt 2

            $b3
              Content-Type: TypeN

            Inhalt N

            $b3--

            usw.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
          2. Hello,

            Ich verstehe nicht, wie man die kombinieren kann?

            Schau nochmal in RFC-1521   Media Types

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau