问题,突然发送.docx作为邮件附件

时间:2016-08-30 21:56:59

标签: php email email-attachments docx

我有一个自定义的PHP表单,大约3年前编码。它的目的是通过电子邮件发送包括docx文件在内的所有附件,并像魅力一样工作。刚刚从今年开始,客户注意到用户抱怨发送表单时出错,允许他们上传简历。故障排除发现它只发生在SOME .docx文件中。我们有大量的.docx文件已上传并通过电子邮件发送。所以它是: 1. .docx编码的变化或者我不熟悉的东西 2.用户必须以某种方式破坏他们的.docx文件。

我搜索了代码编码方式的任何证据.docx文件已更改,一无所获。我的代码似乎是上传多个文件的最佳实践,甚至是.docx文件。为了确保我发布我的send-mail.php文件并询问是否有人看到允许所有列出的文件格式的东西,以及一些.docx发送​​FINE,但是一些.docx文件正在阻塞脚本并且在&#失败34;如果(好){" line,表示发送邮件时出错。提前感谢您的帮助。

更新:似乎它无法处理保存在" Word 2016"格式。那么,我需要对下面的代码做些什么来使其与Word 2016文件一起工作?

 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 = "xxxx@gmail.com";
  $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 个答案:

答案 0 :(得分:4)

很难说没有任何测试文件/案例,但我的猜测是错误的Content-Type,因为你只依赖$ file [&#39; type&#39;]。

  

浏览器中的硬编码列表非常有限。通常,浏览器发送的MIME类型将是操作系统报告的类型。这就是为什么,如问题所述,浏览器报告的MIME类型不可靠   How is mime type of an uploaded file determined by browser?

尝试将其更改为&#34;通用&#34;

  

应用/八位字节流

答案 1 :(得分:1)

您的代码似乎很完美,但建议您执行某些操作以确保脚本正常运行。

请更改阅读文件内容,因为它不会改变任何内容,只会改变内存使用情况,因为:

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

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

所以它会减少内存使用和处理文件

第二次改变:

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

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

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

您需要确认电子邮件发送附件大小的设置。因为一些系统不允许发送超过100 KB或500 KB的PHP电子邮件非常重要。

如果上述事情无法解决问题,请告知我建议其他事项。