Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] kein eMailversand mit größeren Dateianhängen möglich

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] kein eMailversand mit größeren Dateianhängen möglich

    Hallo,

    ich möchte aus einer Webanwendung gerne eMails mit einer unbestimmten Anzahl von Dateianhängen (nur PDF-Dateien) verschicken. Nach einigen
    Recherchen habe ich mir dazu eine Funktion geschrieben:
    PHP-Code:
    <?php
    function mail_mit_pdfanhang($Empfaenger$AbsenderName$AbsenderMail$Betreff$Nachricht$Dateiliste){
    /*
    $Dateiliste ist ein asoziatives array in dem der key den "Dateinamen in der Mail" enthält und value den relativen Dateipfad auf dem Server
    */
        
    $debug=true;
        
    $Trenner md5(uniqid(time())); 
        
    $Header "From: $AbsenderName <$AbsenderMail>\r\n"
        
    $Header .= "MIME-Version: 1.0\r\n"
        
    $Header .= "Content-Type: multipart/mixed; boundary=$Trenner\r\n"
        
    $Header .= "\r\n"
        
    $Header .= "This is a multi-part message in MIME format\r\n"
        
    $Header .= "--$Trenner\r\n"
        
    $Header .= "Content-Type: text/plain; charset=ISO-8859-1\r\n"
        
    $Header .= "Content-Transfer-Encoding: quoted-printable\r\n";
        
    $Header .= "\r\n"
        
    $Header .= "$Nachricht\r\n"
     
        foreach (
    $Dateiliste AS $DateinameMail=>$Dateiname) {
            if (
    $debug) echo $DateinameMail."<br />\n".$Dateiname."<br />\n";
     
            
    $Header .= "--$Trenner\r\n"
             
    $Header .= "Content-Type: application/pdf; name=$DateinameMail\r\n"
             
    $Header .= "Content-Transfer-Encoding: base64\r\n"
             
    $Header .= "Content-Disposition: attachement; filename=$DateinameMail\r\n"
             
    $Header .= "\r\n"
             if (
    $debug) echo "a<br />\n";
             
    $Dateiinhalt fread(fopen($Dateiname"r"), filesize($Dateiname)); 
             if (
    $debug) echo "b<br />\n";
             
    $Header .= chunk_split(base64_encode($Dateiinhalt)); 
             if (
    $debug) echo "c<br />\n";
             
    $Header .= "\r\n";
        }
     
         
    $Header .= "--$Trenner--"
         if (
    $debug) echo "d<br />\n";
         
    $infomail($Empfaenger$Betreff""$Header);
         if (
    $debug) echo "e<br />\n";
         return 
    $info;
    }
    ?>
    Sie funktioniert auch ganz gut. eMails ohne, mit einer und mit zwei PDF-Dateien kommen an. Bei Aufruf von
    PHP-Code:
    <?php
    $dateiliste
    ["21kb_Datei.pdf"] = ".\\_data\\anhaenge\\21kb_Datei.pdf"//eine Datei die 21 Kilobyte groß ist
    $dateiliste["16kb_Datei.pdf"] = ".\\_data\\anhaenge\\16kb_Datei.pdf"//eine Datei die 16 Kilobyte groß ist
    mail_mit_pdfanhang($mail_adresse$von_name$von_email$betreff$mail_nachricht$dateiliste)
    ?>
    bekomme ich die folgende Ausgabe:
    21kb_Datei.pdf
    .\_data\anhaenge\21kb_Datei.pdf
    a
    b
    c
    16kb_Datei.pdf
    .\_data\anhaenge\16kb_Datei.pdf
    a
    b
    c
    d
    e
    Allerdings dauert es ca. 15 Sekunden bis das "e" erscheint (alle anderen ausgaben erscheinen sofort beim aufruf meines Scripts). Als ich
    eine größere Datei (90kb) verschicken wollte hat dies nicht funktioniert, das "e" erscheint nicht und ich muss erst den InternetExplorer
    zumachen damit ich wieder auf die Seite zugreifen kann.
    Liegt das an max_execution_time ? Kann ich irgendwo feststellen ob mein Script wegen zu langer Laufzeit abgebrochen wurde?
    Habe ich vielleicht einen Fehler drin, oder gibt es evtl. andere Funktionen die große eMails schneller versenden?
    Vielen Dank für eure Antworten, ich hoffe ihr könnt mir weiterhelfen, damit ich später mal eMails mit Anhängen von bis zu 1MB versenden
    kann.
    Sonstiges:
    Es handelt sich um einen Windows Server und soweit ich das beurteilen kann, läuft der SMTP-Server auf einem anderen Rechner im Netzwerk.
    PHP Version 5.2.4
    error_reporting(E_ALL); ->keine Meldungen

    schöne Grüße,
    Marco


  • #2
    Hallo,
    bitte benutz doch den phpMailer, seit seiner Einfuehrung vor einigen Jahren hab ich mich nicht mehr mit Email-Headern beschaeftigt, und mit mir haben das ziemlich viele andere auch aufgegeben.

    Er ist kostenlos und kann alles:
    :: PHPMailer ::
    "Mein Name ist Lohse, ich kaufe hier ein."

    Kommentar


    • #3
      Hi Chriz,

      vielen Dank für den Link, ich habe mir v2.0.0 mal runtergeladen. Die Methode =>Send() bzw. =>MailSend() verwendet ja auch die phpeigene Funktion mail(), deshalb bin ich da noch etwas skeptisch ob alles gut wird. Aber ich werde es gleich mal ausprobieren und berichten.

      Trotzdem würde mich noch interessieren woran man erkennt, dass die max_execution_time erreicht wurde. Denn es kann ja auch andere Ursachen haben, dass nichts mehr passiert.

      Kommentar


      • #4
        Hallo,

        es kommt eigentlich weniger auf den Transporteur als auf das richtige Format an und wie du bemerkt hast kann man eine Menge falsch machen.

        max_execution_time bekomme ich eigentlich immer direkt angezeigt, display_errors on und error_reporting E_ALL | E_STRICT.
        "Mein Name ist Lohse, ich kaufe hier ein."

        Kommentar


        • #5
          Hey ich bin begeistert (PHPMailer läuft wunderbar), und zugleich enttäuscht (Das was ich mir ausgedacht habe ist wohl doch nicht so toll wie ich in meiner Euphorie dachte.).

          Mit PHPMailer habe ich gerade vier Anhänge (zusammen ca. 500kB) innerhalb von einer Sekunde versendet. Warum das nun so viel schneller ist als meine Version versteh ich zwar nicht, aber hauptsache es funktioniert.

          Vielen Dank an Chriz, das Forum und die Leute die PHPMailer geschrieben haben.

          Gruß,
          Marco

          Kommentar

          Lädt...
          X