我有一个自定义的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
答案 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电子邮件非常重要。
如果上述事情无法解决问题,请告知我建议其他事项。