Andi: Email mit Anhang

Hallo!

Ich versuche verzweifelt eine Email mit Anhang zu versenden.
Aber er schickt mir immer nur einen Teil der Datei mit.

Hier mein Quellcode:

$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/mixed; boundary="$boundary";\r\n";

/* Hier faengt der normale Mail-Text an */
$mail_header .= "--$boundary\r\n";
$mail_header .= "Content-Type: text/plain;\r\n";
$mail_header .= "Content-Transfer-Encoding: 8bit\r\n";
$mail_header .= "<hmtl><body>Das ist eine Email mit Anhang</body></html>\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-Disposition: attachment\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));
$mail_header .= $reply."\r\n";

/* Gibt das Ende der eMail aus */
$mail_header .= "--$boundary--\r\n";

return mail("KARL@spam.de","Ja hallo","",$mail_header);

Weiß nicht weiter.

Danke im voraus!

Grüße
Andi

  1. Hallo!

    Wie groß ist denn die Datei?
    Wenn das Attachment geschickt wird, aber nur teilweise ankommt, dann wird das Problem wohl irgendwo in der Server-Konfiguration liegen. Es könnte eine Begrenzung der Anhang-Größe geben.

    Gruß

    Matthias

    --
    ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
    http://www.makaio.de/quotations
  2. Hello Andi,

    $reply = chunk_split(base64_encode($attach_content));

    Da steckt der Fehler. Chunk_Split() hat als Default-Linebreak das "\r\n". Das ist aber leider bei base64-teilen falsch. Diese benötigen nur "\n". Geht aus irgendeinder RFC hervor. Ich kanns mir aber immer nicht merken.

    also  $reply = chunk_split(base64_encode($attach_content),76,"\n");

    sollte Dur helfen. Mach mal Piep, wenn es geklappt hat.

    http://de.php.net/manual/en/function.chunk-split.php

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

    Tom

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

      Das mit dem chunk_split hat nichts genutzt, er schikt mir immer noch nur Teile der Datei mit.

      Grüße
      Andi

      1. Hello,

        Das mit dem chunk_split hat nichts genutzt, er schikt mir immer noch nur Teile der Datei mit.

        Ich sehe gerade, es fehlt auch noch die Leerzeile zwischen Mailheader und Mailbody, oder habe ich die übersehen?

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

        $mail_header .= "Die ist eine mehrteilige email mit HTML-Teil. Wenn Sie diesen\r\n";
        $mail_header .= "Text sehen, kann Ihr Mailprogramm evtl. kein HTML darstellen\r\n\r\n";

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

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

        Tom

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

          Ich sehe gerade, es fehlt auch noch die Leerzeile zwischen Mailheader und Mailbody, oder habe ich die übersehen?

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

          $mail_header .= "Die ist eine mehrteilige email mit HTML-Teil. Wenn Sie diesen\r\n";
          $mail_header .= "Text sehen, kann Ihr Mailprogramm evtl. kein HTML darstellen\r\n\r\n";

          Verstehe nicht ganz, wo die Leerzeile fehlt?

          Grüße
          Andi

          1. Hello,

            Ich sehe gerade, es fehlt auch noch die Leerzeile zwischen Mailheader und Mailbody, oder habe ich die übersehen?

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

            $mail_header .= "Die ist eine mehrteilige email mit HTML-Teil. Wenn Sie diesen\r\n";
            $mail_header .= "Text sehen, kann Ihr Mailprogramm evtl. kein HTML darstellen\r\n\r\n";

            Verstehe nicht ganz, wo die Leerzeile fehlt?

            Na jetzt nicht mehr. Ich habe sie doch eingefügt.

            Lass Dir mal die Variable $mail_header nach der Generierung ausgeben

            echo "<pre>";
            echo $mail_header;
            echo "</pre>";

            Dann sieht man besser, woran es liegt.

            Und poste das Ergebnis mal hier, aber bitte ohne das gesamte Bild. ;-)

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

            Tom

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

              Also hier die Header:

              MIME-Version: 1.0
              Content-Type: multipart/mixed; boundary="A9D3E097D0F4704F56D6CFD0733891A3";

              --A9D3E097D0F4704F56D6CFD0733891A3
              Content-Type: text/plain;
              Content-Transfer-Encoding: 8bit
              Das ist eine Email mit Anhang
              --A9D3E097D0F4704F56D6CFD0733891A3
              Content-Type: image/jpeg; name="test.jpg";
              Content-Transfer-Encoding: base64
              Content-Disposition: attachment
              <Hier das Bild>
              --A9D3E097D0F4704F56D6CFD0733891A3--

              Grüße
              Andi

              1. Hello,

                Also hier die Header:

                Nee, das sind nicht nur die Hewader, sondern das ist die ganze email (natürlich gekürzt), bestehend aus Mailheader und Mailbody. Dass das alles in $mail_header steht, ist reine Benennungssache.

                MIME-Version: 1.0
                Content-Type: multipart/mixed; boundary="A9D3E097D0F4704F56D6CFD0733891A3";

                ist das hier die Wahrheit? Woher kommt jetzt diese Leerzeile? Hast Du am Code was geändert?

                --A9D3E097D0F4704F56D6CFD0733891A3
                Content-Type: text/plain;
                Content-Transfer-Encoding: 8bit
                Das ist eine Email mit Anhang
                --A9D3E097D0F4704F56D6CFD0733891A3
                Content-Type: image/jpeg; name="test.jpg";
                Content-Transfer-Encoding: base64
                Content-Disposition: attachment
                <Hier das Bild>
                --A9D3E097D0F4704F56D6CFD0733891A3--

                Aber ich vermute noch zwei andere Fehler. Erstmal den einen:
                Versendest Du dioe email mit der mail()-Funktion?

                Dann lass auf jeden Fall die Variable für Text leer. Das Problem hatte ich auch, dass PHP das nicht sortiert bekommen hat. Falls das immer noch nicht fruchtet, habe ich aber noch eine Idee.

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

                Tom

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

                  Versende die Email mit der Mail Funktion:

                  return mail("andreas.heinisch@idealnet.com","Ja hallo","",<Hier kommen die Header>);

                  Und das sind die Header:

                  MIME-Version: 1.0
                  Content-Type: multipart/mixed; boundary="A9D3E097D0F4704F56D6CFD0733891A3";
                  --A9D3E097D0F4704F56D6CFD0733891A3
                  Content-Type: text/plain;
                  Content-Transfer-Encoding: 8bit
                  Das ist eine Email mit Anhang
                  --A9D3E097D0F4704F56D6CFD0733891A3
                  Content-Type: image/jpeg; name="test.jpg";
                  Content-Transfer-Encoding: base64
                  Content-Disposition: attachment
                  <Hier das Bild>
                  --A9D3E097D0F4704F56D6CFD0733891A3--

                  Grüße
                  Andi

                  1. Hello,

                    Hallo!

                    Versende die Email mit der Mail Funktion:

                    Ja sorry das hatte ich inzwischen schon bemerkt ;-)

                    Und das sind die Header:

                    MIME-Version: 1.0
                    Content-Type: multipart/mixed; boundary="A9D3E097D0F4704F56D6CFD0733891A3";  ###hiernach \r\n
                    --A9D3E097D0F4704F56D6CFD0733891A3                     ## dies ist schon der Mailbody
                    Content-Type: text/plain;
                    Content-Transfer-Encoding: 8bit
                    Das ist eine Email mit Anhang
                    --A9D3E097D0F4704F56D6CFD0733891A3
                    Content-Type: image/jpeg; name="test.jpg";
                    Content-Transfer-Encoding: base64
                    Content-Disposition: attachment
                    <Hier das Bild>
                    --A9D3E097D0F4704F56D6CFD0733891A3--

                    Und zwischen Header und Body muss immer eine Leerzeile stehen. Hinter einem Content steht (bei mir) auch immer eine. Woher soll der Mailserver sonst wissen, wo z.B. ein base64-Block zuende ist. Ob er das nur an der Boundary erkannen kann, bezweifle ich.

                    Eddi hat es wohl auch so beschrieben, also rein mit den Leerzeilen. Die kosten ja nix.

                    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!

                      Danke für dein Hilfe es funktioniert jetzt!

                      Grüße
                      Andi

                    2. Hallo!

                      Und zwischen Header und Body muss immer eine Leerzeile stehen.

                      Absolut richtig er muß ausdrücklich auch mit \r\n gemacht werden, sonnst nimmt es nicht jeder Client wahr.

                      Gruß aus Berlin!
                      eddi

                      --
                      Manchmal trifft es einen doch ganz unverhofft t86591:
                      > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
                      Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
                      1. Hallo!

                        Was aber jetzt nicht mehr funktioniert ist das er mir das HTML nicht interpretiert also nur den Text ausgibt.

                        Ich drehe langsam durch

                        Grüße
                        Andi

                        1. Hallo!

                          Was aber jetzt nicht mehr funktioniert ist das er mir das HTML nicht interpretiert also nur den Text ausgibt.

                          Ich drehe langsam durch

                          Grüße
                          Andi

                          Fehler von mir. Geht doch.

                          Grüße und Danke
                          Andi

                2. Hello,

                  Aber ich vermute noch zwei andere Fehler. Erstmal den einen:
                  Versendest Du dioe email mit der mail()-Funktion?

                  Dann lass auf jeden Fall die Variable für Text leer. Das Problem hatte ich auch, dass PHP das nicht sortiert bekommen hat. Falls das immer noch nicht fruchtet, habe ich aber noch eine Idee.

                  Entschuldige, es war ja im OP zu sehen, wie Du das macht. Dann also das letzte Geschoss auf den Fehler, nicht ganz wissenschaftlich abgesichert, aber mein Mailprogramm funktioniert so und Deins sieht gleich genauso aus. Also:

                  Vor und nach jeder Boundary auch eine Leerzeile einfügen. Dann erst den Content des Abschnittes. Es handelt sich ja quasi um Subbodies.

                  Dieser Test kostet Dich nur einen weiteren Versuch und dann gehen mir sowieso auch die Ratschläge aus.

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

                  Tom

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

                    Es funktioniert jetzt!

                    Danke für deine Mühe.

                    Grüße
                    Andi

                    1. Hello,

                      Es funktioniert jetzt!

                      Danke für deine Mühe.

                      Bitte. Aber probier ruhig nochmal aus, wie sich das System verhält, wenn Du beim base64-Block "\r\n" statt "\n" benutzt. Meins will dann nicht mehr.

                      das MIME-Mailformat ist ein rekursives Format. Daher nehme ich an, dass das mit den Leerzeilen NACH dem Sub-Content auch richtig ist, davor auf alle Fälle.

                      http://netzmafia.de/rfc/rfc/rfc2822.txt

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

                      Tom

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

                Also hier die Header:

                MIME-Version: 1.0
                Content-Type: multipart/mixed;

                boundary="A9D3E097D0F4704F56D6CFD0733891A3";
                (nächste Zeileund \t davor da die Zeile über 75 Zeichen gorß ist)

                --A9D3E097D0F4704F56D6CFD0733891A3
                Content-Type: text/plain;
                Content-Transfer-Encoding: 8bit

                hier sollte \r\n\r\n

                Das ist eine Email mit Anhang

                hier sollte \r\n\r\n

                --A9D3E097D0F4704F56D6CFD0733891A3
                Content-Type: image/jpeg; name="test.jpg";
                Content-Transfer-Encoding: base64
                Content-Disposition: attachment

                hier sollte \r\n\r\n

                <Hier das Bild>

                Ist es den im Format base64?

                --A9D3E097D0F4704F56D6CFD0733891A3--

                Grüße
                Andi

                Gruß aus Berlin!
                eddi

                --
                Manchmal trifft es einen doch ganz unverhofft t86591:
                > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
                Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
                1. Hallo!

                  Habe es so probiert und es funktioniert:

                  MIME-Version: 1.0
                  Content-Type: multipart/mixed;
                         boundary="A9D3E097D0F4704F56D6CFD0733891A3";
                  (nächste Zeileund \t davor da die Zeile über 75 Zeichen gorß ist)

                  --A9D3E097D0F4704F56D6CFD0733891A3
                  Content-Type: text/plain;
                  Content-Transfer-Encoding: 8bit
                  hier sollte \r\n\r\n
                  Das ist eine Email mit Anhang
                  hier sollte \r\n\r\n
                  --A9D3E097D0F4704F56D6CFD0733891A3
                  Content-Type: image/jpeg; name="test.jpg";
                  Content-Transfer-Encoding: base64
                  Content-Disposition: attachment
                  hier sollte \r\n\r\n
                  <Hier das Bild>
                  Ist es den im Format base64?
                  --A9D3E097D0F4704F56D6CFD0733891A3--

                  Grüße
                  Andi

                  1. Hallo!

                    Habe es so probiert und es funktioniert:

                    Das Problem kenne ich noch seit meinem allerersten Newletter-script ;)

                    Gruß aus Berlin!
                    eddi

                    --
                    Manchmal trifft es einen doch ganz unverhofft t86591:
                    > '..."Vorläufig abgebrochen" ist ungefähr so sinnvoll formuliert, wie "einstweilig erschossen" oder "temporär verbrannt"...'
                    Ich danke Sven für diese Erkenntnis - Gott, was habe ich gelacht ;)
        2. Hallo Tom!

          Es fetzt immer noch nicht.

          Grüße
          Andi