mika: Email mit PDF als Anhang schicken

Hallo Zusammen,

ich versuche schon seit Stunden eine Email mit PDF als Anhang zu schicken.
Die Email wird auch mit Anhang verschickt, jedoch lässt sich das PDF-File nicht öffnen, weil es entweder, laut Acrobat Reader bedingt durch falsche Codierung zerstört ist, oder im Quellcode des PDFs die Emailnachricht steht.

Ich habe nun schon mehrere Foren und Threads durchforstet und mein PHP-Code entsprechend den Tipps angepasst.
Mit dem Ergebnis, dass die Email nun gar nicht vershcickt wird, da die Funktion "$data = chunk_split(base64_encode($data));" anscheinend ewig braucht / bei der Ausführung hängen bleibt.

Weiß jemand was ich falsch mache?

Danke und Gruß
Mika

//Email-Versandt für erfolgreichen Ablauf
function sendEmail1($empfaenger, $betreff, $absender, $text, $anhang) {
  $to = "<$empfaenger>";
  $subject = $betreff;
  $boundary = strtoupper(md5(uniqid(time())));

$fp = fopen($anhang, 'r');
  $data = fread($fp,filesize($anhang));
  fclose($fp);

$data = chunk_split(base64_encode($data));

$header = "MIME-Version: 1.0\n";
  $header .= "From: <$absender>\n";
  $header .= "Content-Type: multipart/mixed; boundary=$boundary\n\n";
  $header .= "This is a multi-part message in MIME format  --  Dies ist eine mehrteilige Nachricht im MIME-Format\n";

$header .= "--$boundary\n";
  $header .= "Content-Type: text/html\n";
  $header .= "Content-Transfer-Encoding: 8bit\n\n";
  $header .= "$text\n";

$header .= "--$boundary\n";
  $header .= "Content-Type: application/pdf; name=$dateiname\n";
  $header .= "Content-Transfer-Encoding: base64\n";
  $header .= "Content-Disposition: attachment; filename=$dateiname\n\n";
  $header .= $data."\n";
  $header .= "--$boundary--\n";

if(mail($to, $subject, $message, $header)) {
    $msg = '<br /><br /><span>Email wurde erfolgreich gesendet</span>';
  }
  else {
    $msg = '<br /><br /><span class="failure">Email konnte nicht gesendet werden</span>';
  }
  return $msg;
}

  1. Hellihello

    zum einen könntest Du versuchen, Deine Header auf das Nötige runterzuschrauben, um erstmal den Anhangsversand hinzubekommen.

    Alternativ könntest Du vielleicht die bestimmt super-funktionsfähige Klasse aus dem Zend-Framework nehmen.

    http://framework.zend.com/manual/en/zend.mail.attachments.html

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt
    1. Hallo,

      ich habe die Funktion ein wenig angepasst und nun lässt sich das PDF-Dokument nicht nur senden sondern auch nach dem Senden öffnen.

      Aber sobald ich versuche einen Emailtext mitzuschicken, lässt sich das PDF nicht mehr öffnen.

      //Email-Versandt für erfolgreichen Ablauf
      function sendEmail1($empfaenger, $betreff, $absender, $text, $anhang) {
        $to = "<$empfaenger>";
        $subject = $betreff;
        $boundary = strtoupper(md5(uniqid(time())));

      $file_content = fread(fopen($anhang,"r"),filesize($anhang));
        $file_content = chunk_split(base64_encode($file_content));

      $header = "MIME-Version: 1.0\r\n";
        $header .= "From: <$absender>\r\n";
        $header .= "Content-Type: multipart/mixed; boundary=$boundary\r\n";
        $header .= "This is a multi-part message in MIME format  --  Dies ist eine mehrteilige Nachricht im MIME-Format\r\n";

      /************ hier möchte ich den Text definieren****************
        $header .= "--$boundary\r\n";
        $header .= "Content-Type: text/html\r\n";
        $message = "<html><body>$text</body></html>\r\n\r\n";
        **************************************************************/

      $header .= "--$boundary\r\n";
        $header .= "Content-Type: application/octetstream; name=$anhang\r\n";
        $header .= "Content-Transfer-Encoding: base64\r\n";
        $header .= "Content-Disposition: attachment; filename=$anhang\r\n";
        $message .= $file_content."\r\n";
        $header .= "--$boundary--\r\n";

      if(mail($to, $subject, $message, $header)) {
          $msg = '<br /><br /><span>Email wurde erfolgreich gesendet</span>';
        }
        else {
          $msg = '<br /><br /><span class="failure">Email konnte nicht gesendet    werden</span>';
        }
        return $msg;
      }

      1. Hallöchen,

        Logisch:

        $message = "<html><body>$text</body></html>\r\n\r\n";

        weist $message den gewünschten Text zu, bindet ihn aber nicht in $headers ein.

        $message .= $file_content."\r\n";

        erweitert $message um die codierte PDF Datei, bindet sie jedoch ebenfalls nicht mehr in $headers ein.

        Ersetze die Zuweisung an $message an BEIDEN Stellen durch "$header .=", und ändere die malil() Funktion wie folgt ab:

          
        if(mail($to, $subject, '', $header)) {  
          $msg = '<br /><br /><span>Email wurde erfolgreich gesendet</span>';  
        }  
        
        

        Beim Versenden einer mehrteiligen eMail, also z.B. wie hier einer mit Anhang, MUSS ja JEDER Teil der eMail in seinem mit dem $boundary abgegrenzten Bereich stehen. Daher bei der mail() Funktion dem 3. Parameter einen Leerstring übergeben. Was bei einer einfachen eMail da drin steht, hast du ja in $header.

        Dass der Versand bei leerem $message geklappt hat, dürfte damit auch geklärt sein.

        MfG
        vaudi

        1. $message .= $file_content."\r\n";

          erweitert $message um die codierte PDF Datei, bindet sie jedoch ebenfalls nicht mehr in $headers ein.

          wenn ich die codierte PDF Datei in den Header einbinde, bleibt das Skript hängen, weil es anscheinend zu viel Inhalt im Header gibt...

          Ersetze die Zuweisung an $message an BEIDEN Stellen durch "$header .=", und ändere die malil() Funktion wie folgt ab:

          if(mail($to, $subject, '', $header)) {
            $msg = '<br /><br /><span>Email wurde erfolgreich gesendet</span>';
          }

          
          >   
          > Beim Versenden einer mehrteiligen eMail, also z.B. wie hier einer mit Anhang, MUSS ja JEDER Teil der eMail in seinem mit dem $boundary abgegrenzten Bereich stehen. Daher bei der mail() Funktion dem 3. Parameter einen Leerstring übergeben. Was bei einer einfachen eMail da drin steht, hast du ja in $header.  
          >   
          > Dass der Versand bei leerem $message geklappt hat, dürfte damit auch geklärt sein.  
          >   
            
          wenn ich den Text im Header unterbringe wird er in der Mail auch nicht angezeigt  
          
          
          1. Hallöchen,

            wenn ich die codierte PDF Datei in den Header einbinde, bleibt das Skript hängen, weil es anscheinend zu viel Inhalt im Header gibt...

            Kann ich mir schlecht vorstellen, bei mir funktioniert eine entsprechende eMail mit 4 PDF's mit insgesamt ca. 80 Seiten...

            wenn ich den Text im Header unterbringe wird er in der Mail auch nicht angezeigt

            Wenn überhaupt was ankommt: Speicher mal das, was ankommt, als *.eml ab, und öffne das mit einem Texteditor.

            Und schicke dir mal das, was du mit PHP lösen willst, selbst über dein eMail Programm, speicher und öffne die erhaltene eMail ebenfalls und vergleiche dann.

            Mit Sicherheit findest du dann Unterschiede. Und die geben vermutlich auch Hinweise auf das, was falsch ist.

            MfG
            vaudi