gp812: pdf mit php versenden

Hi.
Habe folgendes Code:
/////////////////////// anfang //////////////////
  $path = "orders/";
  $send_pdf =  "bestellung_".$newnummer.".pdf";

if($unhappy=true)
  {
          ///////////////////////////////////////
          // pdfs
          $file = $send_pdf;
          $file_name = $send_pdf;
          $from = "from@test.de";
          $to = "qwerty@qwerty.de";
          ////////////// message ////////////////////////
          // betreff
          $subject = "pdf-test";
          ////////////// message ////////////////////////
          $message  = "\n\ndrei pdfs als attachment schicken\n\n";
          ////////////// message ////////////////////////
          //////////////// header ///////////////////////
          $boundary = strtoupper(md5(uniqid(time())));
          $mail_header  = "From: <$from>\n";
          $mail_header .= "MIME-Version: 1.0";
          $mail_header .= "\nContent-Type: multipart/mixed; boundary=$boundary";
          $mail_header .= "\n\nThis is a multi-part message in MIME format  --  Dies ist eine mehrteilige Nachricht im MIME-Format";
          $mail_header .= "\n--$boundary";
          $mail_header .= "\nContent-Type: text/plain";
          $mail_header .= "\nContent-Transfer-Encoding: 8bit";
          $mail_header .= "\n\n$message";
          //////////////// header ///////////////////////
          //////////////// attachment1 ///////////////////////
          $mail_header .= "\n--$boundary";
          $mail_header .= "\nContent-Type: application/x-download; name="$file_name"";
          $mail_header .= "\nContent-Transfer-Encoding: base64";
          $mail_header .= "\nContent-Disposition: attachment; filename="$file_name"";
          $file_content = fread(fopen($path.$file,"r"),filesize($path.$file));
          $file_content = chunk_split(base64_encode($file_content));
          $mail_header .= "\n\n$file_content";
          $mail_header .= "\n--$boundary";

//////////////// mail ///////////////////////
          $success = mail($to,$subject,$message,$mail_header);

if($success)
              {
              echo "mail wurde versandt";
              echo "email wurde versendet";
              }
          else
              {
              echo "email wurde <b>nicht</b> versandt";
              }
      }
  else
      {
      // wenn es keine datei gibt, gibt es auch nichts zu versenden
      echo "keine mail versendet, da es keine datei gibt";
      }

/////////////////////// ende //////////////////

Das problem, das die .pdf-datei, die ankommt, ist immer 1KB groß, und ist nucht lesbar. Dutzend andere scripte bringen das gleiche. Woran liegt es?
Danke voraus.

  1. Huhu

    $file_content = fread(fopen($path.$file,"r"),filesize($path.$file));

    ergänze hier erstmal eine Fehlerbehandlung um sicherzustellen dass beim Dateizugriff nichts schief geht.

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Erstmal Danke für die Antworten.

      Zur:

      if($unhappy=true)

      JA. Es ist immer TRUE, weil wie gesagt, das Script wurde kopiert (ist nicht meins). Mein Script hat das ganze inhalt von .pdf ins Mail-Body reingeschrieben. Dann hab ich 10 Scripten gefunden, und überall stand, es funktioniert :-))

      Und zur Sache :-))
      Ja, fread() hat das ganze "verkürzt". Danke für den Tip min den Fehlermeldung :-)

  2. Hi!

    Ich hatte das mal so gelöst:

    if(!empty($aMail["attachment"]))
    {
     $file = $aMail["attachment"];
     $filename = basename($file);

    // Datei lesbar?
     if(@is_file($file) && @is_readable($file))
     {
      $fp = @fopen($file, "rb");
      if($fp)
      {
       $buffer = fread( $fp, filesize($file) );
       $buffer = base64_encode( $buffer );
       $buffer = chunk_split( $buffer, 72 );
       fclose($fp);

    $aHeader[]  = "--".$sBoundary;
       $aHeader[]  = "Content-Type: application/octet-stream; name="".$filename.""";
       $aHeader[]  = "Content-Transfer-Encoding: base64";
       $aHeader[]  = "Content-Disposition: attachment; filename="".$filename.""";
       $aHeader[]  = $buffer;
      }
      else
      {
       //Datei konnte nicht geöffnet werden
      }
     }
    }

    aber verwende jetzt eigentlich nur noch den phpmailer...;)

  3. echo $begrüßung;

    if($unhappy=true)

    Diese Bedingung evaluiert immer zu true. Falls du einen Vergleich statt einer Zuweisung wolltest, solltest du einen passenden Operator notieren.

    echo "$verabschiedung $name";

  4. Hallo,

    if($unhappy=true)

    das ist bestimmt nicht, was du gemeint hast. Siehe Kommentar von dedlfix.

    $file = $send_pdf;
              $file_name = $send_pdf;

    Warum führst du hier zwei Variablen ein und weist ihnen dasselbe zu?

    $from = "from@test.de";

    Nein, bitte missbrauche nicht schon wieder die Domain der Stiftung Warentest. Nutze für allgemeine Beispiele die Dummy-Domains example.com, example.net, example.org, die dafür gedacht sind.

    $mail_header  = "From: <$from>\n";

    Alle Headerzeilen müssen mit CR+LF abgeschlossen werden, nicht LF allein. Einige Mailserver akzeptieren das zwar, aber darauf kannst du nicht bauen.

    Davon abgesehen: Warum wirst du im weiteren Verlauf inkonsequent und notierst den Zeilenumbruch mal vor, mal nach dem Zeileninhalt? Entscheide dich doch bitte für *eine* Variante (vorzugsweise am Zeilenende), dann wird's auch leichter lesbar.

    $mail_header .= "\n\nThis is a multi-part message in MIME format  --  Dies ist eine mehrteilige Nachricht im MIME-Format";

    Und ab hier wird's wüst: Mit dem zweifachen Zeilenumbruch beendest du die Header. Was danach kommt, ist alles der Body, der *Inhalt* der Message. Das sollte man bitte nicht mit dem Header vermischen; das führt zur Verwirrung.

    $file_content = fread(fopen($path.$file,"r"),filesize($path.$file));

    Ups. Die harmlose Frage ist: Wo schließt du die geöffnete Datei wieder? Aber viel interessanter erscheint mir die Frage, woher du die Gewissheit nimmst, dass deine ganze Datei mit einem einzigen Aufruf von fread() gelesen werden kann. Das PHP-Manual sagt dazu, dass fread() maximal 8192 Byte pro Aufruf zurückgibt. Vielleicht ist dieser Wert auch implementationsabhängig kleiner - das könnte erklären, warum deine Attachments immer nur noch 1k groß sind: Du schneidest sie einfach ab.

    $success = mail($to,$subject,$message,$mail_header);

    Und hier nochmal, was ich am Anfang schon erwähnte: Du übergibst den gesamten Mail-Inhalt über den Parameter "additional headers". Das mag funktionieren; aber ganz gewiss ist es so nicht vorgesehen.

    So long,
     Martin

    --
    Das Gehirn ist schon eine tolle Sache: Es fängt ganz von allein an zu arbeiten, wenn man morgens aufsteht, und hört erst damit auf, wenn man in der Schule ankommt.
      (alte Schülererkenntnis)