Amenul: Emailversand

Hallo zusammen,

Ich bin fast am verzweifeln. Ich weiß nicht aws ich falsch mache und finde meinen Fehler nicht. Ich hoffe, dass Ihr mir weiterhelfen könnt. Ich wäre euch sehr dankbar.

Also, es geht um folgendes:

Ich habe ein Script, welches mir ein PDF auf Basis mehrerer Formulare erzeugt. Die funktioniert einwandfrei. Nun soll diese PDF Datei per Email versendet werden. Funktioniert auch soweit. Nur kann ich den Anhang, also die pdf Datei, nicht öffnen. Es läge ein decodierungsfehler vor.

Hier der Scriptteil für den Emailversand:

$empfaenger = "XXX@XXX.XXX";
$betreff1 ="XXX Bestellung für Standort ";
$betreff2 ="Ticket ";
$betreff =  $betreff1.$ort.$betreff2.$fetch_id["0"];

$dateiname = $prefix.$fetch_id["0"].$endung;
$dateiname_mail = $pref.$fetch_id["0"].$endung;

$id = md5(uniqid(time()));
$dateiinhalt = chunk_split(base64_encode(fread(fopen($dateiname, "r"), filesize($dateiname))));

$kopf = "From: XXX XXX XXXX@XXX.XX\n";
$kopf .= "MIME-Version: 1.0\n";
$kopf .= "Content-Type: multipart/mixed; boundary=$id\n\n";
$kopf .= "This is a multi-part message in MIME format\n";
$kopf .= "--$id\n";
$kopf .= "Content-Type: text/html\n";
$kopf .= "Content-Transfer-Encoding: quoted-printable\n\n";
$kopf .= "E-Mail mit Anhang";
$kopf .= "\n--$id";
// Content-Type: image/gif, image/jpeg, image/png » MIME-Typen - selfHtml.org
$kopf .= "\nContent-Type: application/pdf ; name=$dateiname_mail\n";
$kopf .= "Content-Transfer-Encoding: base64\n";
$kopf .= "Content-Disposition: attachment; filename=$dateiname_mail\n";
$kopf .="\n\n".$dateiinhalt;
$kopf .= "\n--$id--";
mail($empfaenger, $betreff, "", $kopf);

Ich danke euch schoneinmal im vorraus.

Mit freundlichen Grüßen

Amenul

  1. Hallo,

    Ich habe ein Script, welches mir ein PDF auf Basis mehrerer Formulare erzeugt. Die funktioniert einwandfrei. Nun soll diese PDF Datei per Email versendet werden. Funktioniert auch soweit. Nur kann ich den Anhang, also die pdf Datei, nicht öffnen. Es läge ein decodierungsfehler vor.

    stimmt denn die Dateigröße des Anhangs, die der Mailclient angibt?

    $dateiinhalt = chunk_split(base64_encode(fread(fopen($dateiname, "r"), filesize($dateiname))));

    Hier sehe ich eine Falle: fread() liest nicht unbedingt so viel wie angegeben. Das Manual gibt an, dass maximal 8192 Bytes in einem Rutsch gelesen werden. Deine PDF-Datei wird hier also bei 8kB abgeschnitten.
    Verwende stattdessen file_get_contents(), wenn du sicher bist, dass die PDF-Dateien nicht zu groß sind (andernfalls ist der Versand als Mailanhang eh nicht empfehlenswert).

    $kopf .= "\n--$id";
    // Content-Type: image/gif, image/jpeg, image/png » MIME-Typen - selfHtml.org
    $kopf .= "\nContent-Type: application/pdf ; name=$dateiname_mail\n";
    $kopf .= "Content-Transfer-Encoding: base64\n";
    $kopf .= "Content-Disposition: attachment; filename=$dateiname_mail\n";
    $kopf .="\n\n".$dateiinhalt;

    Nach dem Content-Type-Header kommen bei dir insgesamt drei Zeilenumbrüche, zwei sollten es sein. Ich glaube zwar nicht, dass das ein Problem ist, aber sicher ist sicher ...

    Ciao,
     Martin

    --
    Die letzten Worte der Challenger-Crew:
    Lasst doch mal die Frau ans Steuer!
    1. Hi

      Danke für die schnelle Antwort. Ich habe die Zeilenumbrüche reduziert und auf file_get_contents verwendet. Auch ohne Erfolg. Es hat allerdings vor 2-3 Stunden 1x funktioniert. Da war der Anhang der Email 8 KB groß und deise
      konnte ich öffnen. Alle anderen Emails, bzw die PDFs darin, sind 199Byte groß, als würde da schon viel eher etwas abgeschnitte. ALso file_get_contents verhalten sich gleich.
      Ich habe noch zusätzlich nach der generierung der Mail die funktion, dass der browser das generierte pdf downloaded. Dort hat die pdf datei zwischen 7,8 und 8,1 Kb, also sollte es doch eigentlich keine Probleme mit fread geben?!? Wäre ja in dem Fall dort genau im grenzbereich.
      Sonst noch irgendeine Idee ?

      Gruß

      Amenul

      1. Hallo,

        Danke für die schnelle Antwort. Ich habe die Zeilenumbrüche reduziert und auf file_get_contents verwendet. Auch ohne Erfolg. Es hat allerdings vor 2-3 Stunden 1x funktioniert. Da war der Anhang der Email 8 KB groß und deise
        konnte ich öffnen.

        ah, sowas liebe ich wie Lebertran: Programme, die "manchmal" funktionieren!

        Alle anderen Emails, bzw die PDFs darin, sind 199Byte groß, als würde da schon viel eher etwas abgeschnitte. ALso file_get_contents verhalten sich gleich.

        Du schreibst eingangs, dass das PDF dynamisch erzeugt wird. Könnte es sein, dass du hier ein Problem mit der zeitlichen Koordinierung hast? Dass also die Erzeugung des PDFs noch nicht fertig ist, wenn dein Mail-Script darüber herfällt?
        Was sagt der Return-Wert von file_get_contents(), der ja gemäß dem Manual im Fehlerfall false ist?
        Fängt die verstümmelte PDF-Datei denn wenigstens mit der Zeichenfolge "%PDF" an? Anders gefragt: Stimmen die ersten 199 Byte denn mit dem Anfang der korrekten PDF-Datei überein, oder bekommst du rein zufällige Daten?

        Ich habe noch zusätzlich nach der generierung der Mail die funktion, dass der browser das generierte pdf downloaded. Dort hat die pdf datei zwischen 7,8 und 8,1 Kb, also sollte es doch eigentlich keine Probleme mit fread geben?!? Wäre ja in dem Fall dort genau im grenzbereich.

        Ich würde trotzdem entweder auf fread() verzichten, oder wenn du es weiter verwenden willst, dann bitte in einer Schleife lesen, bis das Dateiende erreicht ist (Beispiel).

        So long,
         Martin

        --
        Treffen sich zwei Holzwürmer im Käse: "Na, auch Probleme mit den Zähnen?"
        1. Hi

          Manchmal wäre ja schön :). Es ging nur einmal, warum weiß ich leider nicht. Der Rückgabewert der funktion ist in Ordnung.
          Zu dem pdf Dokument im Anhang kann ich nru sagen,d ass ich überhaupt ncihts angezeigt bekomme. Scheint mir fast so als wäre es eine leere defekte pdf Datei. Könnte das sein ?
          Testweise habe ich einfach pdf dateien, so umbenannt, dass sie der entsprechen die generiert werden sollte, womit dann die dynamische Erstellung entfällt, da die Datei für das Mailskript ja schon vorhanden ist. Ich wollte somit den Fall den Du beschreibst ausschließen. Bekomme aber wieder nur die selbe "defekte" Datei als Anhang.
          Ob ich fread oder file_get_contents benutze ist mir eigentlich egal. Kommt ja in beiden Fällen noch eine Fehlerhafte Email an.

          Vielleicht schaffen wir es ja noch :)

          Gruß Amenul

          1. Tach,

            Zu dem pdf Dokument im Anhang kann ich nru sagen,d ass ich überhaupt ncihts angezeigt bekomme.

            überhaupt nichts? Du hast geschrieben, das verunglückte Teil sei 199 Bytes groß. Die müssen ja irgendwas enthalten. Oder meinst du damit, du hast sie nur einfach im PDF-Reader geöffnet? Das bringt uns nicht weiter.
            Deswegen war ich neugierig, was die Datei *wirklich* enthält, wenn du sie mit einem gewöhnlichen Editor, besser noch, einem Hex-Editor anschaust.

            Testweise habe ich einfach pdf dateien, so umbenannt, dass sie der entsprechen die generiert werden sollte, womit dann die dynamische Erstellung entfällt, da die Datei für das Mailskript ja schon vorhanden ist. Ich wollte somit den Fall den Du beschreibst ausschließen. Bekomme aber wieder nur die selbe "defekte" Datei als Anhang.

            Zeig mal den kompletten Quellcode einer solchen verstümmelten Mail (einschließlich des base64-codierten Anhangs). Das können ja bei 199 Byte nur wenige Zeilen sein!

            Vielleicht schaffen wir es ja noch :)

            Eben. Ich versuche in solchen Fällen gern, den Gaul von hinten aufzuzäumen: Was kommt tatsächlich heraus, dann gedanklich einen Schritt zurück und kontrollieren, welche Bedingungen dazu erfüllt sein müssten.

            Ciao,
             Martin

            --
            Vielseitigkeit: Von vielen Dingen keine Ahnung haben.
            1. Hallo,

              Zeig mal den kompletten Quellcode einer solchen verstümmelten Mail (einschließlich des base64-codierten Anhangs). Das können ja bei 199 Byte nur wenige Zeilen sein!

              Vielleicht schaffen wir es ja noch :)

              tja, wer nicht mehr will...
              Dann eben nicht.

              So long,
               Martin

              --
              Der Afrika-Forscher wird gefragt: "Stimmt es, dass man nicht von Löwen angefallen wird, wenn man eine Fackel trägt?" - "Kommt drauf an. Man muss die Fackel sehr schnell tragen."
              1. Hallo,

                Zeig mal den kompletten Quellcode einer solchen verstümmelten Mail (einschließlich des base64-codierten Anhangs). Das können ja bei 199 Byte nur wenige Zeilen sein!

                Vielleicht schaffen wir es ja noch :)

                tja, wer nicht mehr will...
                Dann eben nicht.

                So long,
                Martin

                Hi Martin,

                Tut mir leid, dass ich nicht mehr eher antworten konnte. Ich hatte Urlaub und während der Zeit nicht verfügbar. Ich kümmere mich gleich um Deine weiteren Tips und werde so schnell wie möglich antworten.

                Gruß Amenul

  2.   
    $kopf = "From: XXX XXX <XXXX@XXX.XX>\n";  
    $kopf .= "MIME-Version: 1.0\n";  
    $kopf .= "Content-Type: multipart/mixed; boundary=$id";  
    $body = "This is a multi-part message in MIME format\n";  
    $body .= "--$id\n";  
    $body .= "Content-Type: text/html\n";  
    $body .= "Content-Transfer-Encoding: quoted-printable\n\n";  
    $body .= "E-Mail mit Anhang";  
    $body .= "\n--$id";  
    // Content-Type: image/gif, image/jpeg, image/png » MIME-Typen - selfHtml.org  
    $body .= "\nContent-Type: application/pdf ; name=$dateiname_mail\n";  
    $body .= "Content-Transfer-Encoding: base64\n";  
    $body .= "Content-Disposition: attachment; filename=$dateiname_mail\n";  
    $body .="\n\n".$dateiinhalt;  
    $body .= "\n--$id--";  
    mail($empfaenger, $betreff, $body, $kopf);  
    
    

    Wenn das nicht geht, dann poste mal den Quelltext, der genierten Mail. (Kürze dabei bitte den Teil mit der PDF-Datei)

    Viele Grüße Novi

    --
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)
    1. Hallo Novi,

      Danke für die Antwort. Habe Dein geändertes Script ausprobiert und leider funktioniert es auch nicht. Die pdf Datei im Mailclient ist wieder nur 199 byte groß statt ca. 8 KB, welche es sein sollten, wenn das pdf korrekt generiert wird.  Als Quelltext der generierten Mail, meinst Du den Header der Mail die im auf meinem Client ankommt ?

      Gruß Amenul

      $kopf = "From: XXX XXX XXXX@XXX.XX\n";
      $kopf .= "MIME-Version: 1.0\n";
      $kopf .= "Content-Type: multipart/mixed; boundary=$id";
      $body = "This is a multi-part message in MIME format\n";
      $body .= "--$id\n";
      $body .= "Content-Type: text/html\n";
      $body .= "Content-Transfer-Encoding: quoted-printable\n\n";
      $body .= "E-Mail mit Anhang";
      $body .= "\n--$id";
      // Content-Type: image/gif, image/jpeg, image/png » MIME-Typen - selfHtml.org
      $body .= "\nContent-Type: application/pdf ; name=$dateiname_mail\n";
      $body .= "Content-Transfer-Encoding: base64\n";
      $body .= "Content-Disposition: attachment; filename=$dateiname_mail\n";
      $body .="\n\n".$dateiinhalt;
      $body .= "\n--$id--";
      mail($empfaenger, $betreff, $body, $kopf);

      
      >   
      > Wenn das nicht geht, dann poste mal den Quelltext, der genierten Mail. (Kürze dabei bitte den Teil mit der PDF-Datei)  
      >   
      > Viele Grüße Novi
      
      1. Hallo,

        Als Quelltext der generierten Mail, meinst Du den Header der Mail die im auf meinem Client ankommt ?

        Gruß Amenul

        Ich meinte einfach die ganze Mail ohne den Anhang. Es sieht aber so aus, als würde es doch direkt am Anhang liegen und nicht am Aufbau der Mail. Also poste bitte einfach mal die ganze Mail. Vielleicht liegt ja ein Problem mit der Codierung vor. Funktioniert es denn mit anderen Dateien? Was passiert, wenn du einfach eine Textdatei anhängst?

        Viele Grüße Novi

        --
        "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)