2016-08-30 3 views
4

Ich habe ein benutzerdefiniertes PHP-Formular, das vor etwa 3 Jahren codiert wurde. Es wurde erstellt, um alle Attachments einschließlich docx-Dateien per E-Mail zu versenden und funktionierte wie ein Zauber. Gerade in diesem Jahr bemerkt der Kunde, dass Benutzer sich über Fehler beim Senden von Formularen beschweren, die es ihnen ermöglichen, ihren Lebenslauf hochzuladen. Die Fehlerbehebung hat ergeben, dass dies nur bei einigen .docx-Dateien geschieht. Wir haben eine Tonne DOCX-Dateien, die hochgeladen und per E-Mail geschickt wurden. Also ist es entweder: 1. eine Änderung in der .docx-Codierung oder etwas, das ich nicht kenne 2. Benutzer müssen ihre .docx-Dateien irgendwie korrumpieren.Problem, ganz plötzlich Senden von .docx als Mail-Anhang

Ich suchte nach einem Beweis für die Art zu codieren .docx-Dateien geändert und nichts gefunden. Mein Code scheint der beste Weg zu sein, um mehrere Dateien, auch .docx-Dateien, hochzuladen. Um sicherzustellen, dass ich meine send-mail.php-Datei poste und fragte, ob jemand etwas sieht, das alle aufgelisteten Dateiformate und einige .docx-Dateien FINE senden würde, aber einige .docx-Dateien ersticken das Skript und scheitern beim "If (OK) {"line", bedeutet Fehler beim Senden der Mail. Vielen Dank für die Hilfe.

UPDATE: Scheint, es funktioniert nicht für Dokumente im Word 2016-Format gespeichert. Was müsste ich also mit meinem Code tun, damit er auch mit Word 2016-Dateien funktioniert?

if(isset($_FILES)) { 

    // define allowed extensions 
    $allowedExtensions = array("pdf","doc","docx","gif","jpeg","jpg","png","rtf","txt",""); 
    $files = array(); 

    // loop through all the files 
    foreach($_FILES as $name=>$file) { 

    // define some variables 
    $file_name = $file['name']; 
    $temp_name = $file['tmp_name']; 
    $file_type = $file['type']; 

    // check if this file type is allowed 
    $path_parts = pathinfo($file_name); 
    $ext = $path_parts['extension']; 
    if(!in_array($ext,$allowedExtensions)) { 
     die("Your file type is not allowed. Must be only pdf, txt, doc, docx, gif , jpeg, jpg, png, or rtf. Use backspace to go back."); 
    } 

    // move this file to the server YOU HAVE TO DO THIS 
    $server_file = "/home/content/25/9264325/html/wp-content/uploads/files/$path_parts[basename]"; 
    move_uploaded_file($temp_name,$server_file); 

    // add this file to the array of files 
    array_push($files,$server_file); 
    } 

    // define some mail variables 

    $to = "[email protected]"; 
    $from = $email; 
    $subject ="NEW EMPLOYMENT APPLICATION"; 
    $headers = "From: Cxxxxxxs \r\nReply-To: ".$from; 

    // define our boundary 
    $semi_rand = md5(time()); 
    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 

    // tell the header about the boundary 
    $headers .= "\r\nMIME-Version: 1.0\r\n"; 
    $headers .= "Content-Type: multipart/mixed;\r\n"; 
    $headers .= " boundary=\"{$mime_boundary}\"\r\n\r\n"; 

    // part 1: define the plain HTML email 
    $message ="\r\n\r\n--{$mime_boundary}\r\n"; 
    $message .="Content-Type: text/html; charset=\"iso-8859-1\"\r\n"; 
    $message .="Content-Transfer-Encoding: base64\r\n\r\n" . $msg . "\r\n\r\n"; 


    // part 2: loop and define mail attachments if thee is a file 


      foreach($files as $file) { 
      $aFile = fopen($file,"rb"); 
      $data = fread($aFile,filesize($file)); 
      fclose($aFile); 
      $data = chunk_split(base64_encode($data)); 
      $message .= "\r\n--{$mime_boundary}\r\n"; 
      $message .= "Content-Type: {$file_type};\r\n"; 
      $message .= " name=\"{$file_name}\"\r\n"; 
      $message .= "Content-Transfer-Encoding: base64\r\n"; 
      $message .= "Content-Disposition: attachment;\r\n"; 
      $message .= "filename=\"{$file_name}\"\r\n"; 
      $message .= $data . "\r\n"; 
      $message .= "--{$mime_boundary}--\r\n"; 
      } 

    // send the email 
    $ok = mail($to, $subject, $message, $headers); 
    if ($ok) { 
    header('Location: http://www.xxxxx.com/thank-you/'); 
      } else { 
       echo "<p>mail could not be sent!</p>"; 
      } 
      die(); 
}// if isset files 
+2

Verwenden Sie ['PHPMailer'] (https://github.com/PHPMailer/PHPMailer) oder eine entsprechende Bibliothek, um dieses Heavy Lifting durchzuführen. Wenn Sie darauf bestehen, Ihre eigenen zu rollen, was ist der Wert von '$ file_type' für eine beschädigte Datei? – bishop

Antwort

1

Ihr Code scheint perfekt zu sein, würde aber empfehlen, bestimmte Dinge zu tun, um sicherzustellen, dass Ihr Skript korrekt ausgeführt wird.

Bitte die Lesedatei conents ändern, da es nicht irgend etwas ändern, aber die Speichernutzung nur dann ändern, ab:

$aFile = fopen($file,"rb"); 
$data = fread($aFile,filesize($file)); 
fclose($aFile); 
$data = chunk_split(base64_encode($data)); 

zu

$attachments = chunk_split(base64_encode(file_get_contents('filename.ext'))); 

so wird es den Speicherverbrauch und Handhabung verringern Dateien

Zweiter Wechsel von:

$ok = mail($to, $subject, $message, $headers); 

zu

$ok = @mail($to, $subject, $message, $headers); 

und

if ($ok) { 
}else{ 
    echo $ok; //It will give you the exact error reason here 
} 

Drittens, was Sie haben die Einstellung Ihrer E-Mail zu senden Anlagengröße zu bestätigen. Es ist wichtig, dass einige Systeme das Senden von PHP-E-Mails mit mehr als 100 KB oder 500 KB nicht zulassen.

Wenn obige Sache das Problem nicht löst, lassen Sie mich bitte wissen, um andere Dinge vorzuschlagen.

+0

Ich erwäge, Ihre Änderungen zu tun, aber ich verstehe nicht, warum ALLE Word-Dokumente in Ordnung sein würden. BIS 2016 Version von MS Word kommt heraus und SIE sind nur hickupping? Scheint so, dass 2016 Format ist was sich geändert hat ... nein? Wäre es nicht besser zu untersuchen, wie der Code aktualisiert werden muss, um das neue Format zu ermöglichen? Gibt es jemanden mit Upload-Code, der 2016 Word Doc funktioniert? Ich denke, ich werde einfach PHPMailer-Code versuchen, da sie scheinen gut damit zu arbeiten. –

+0

Nur als eine weitere Notiz könnte es Bild in den genannten Lebenslauf aufgenommen werden, da die meisten E-Mail-Server eine maximale Anhangsgröße von etwa 5 MB haben. Wenn die Datei größer ist, wird sie möglicherweise vom empfangenden Server abgelehnt –

4

Schwer zu sagen, ohne Testdatei/Fall, aber meine Vermutung ist falsch Content-Type, da Sie nur auf $ file ['type'] verlassen.

Die hartcodierten Listen in den Browsern sind ziemlich begrenzt. Oft wird der MIME-Typ, der vom Browser gesendet wird, vom Betriebssystem gemeldet.Und das ist genau, warum, wie in der Frage angegeben, der MIME-Typ durch den Browser gemeldet unzuverlässig ist How is mime type of an uploaded file determined by browser?

Versuchen Sie, es zu "universal"

application/octet-stream

Verwandte Themen