PHP无法向邮件发送附件问题求助
问题分析与解决方案
你的HTML表单配置是正确的(已设置enctype="multipart/form-data"),问题出在PHP的邮件发送逻辑上:
- 原生
mail()函数默认发送纯文本邮件,无法直接添加附件,必须手动构建多部分MIME格式的邮件内容 $_FILES是数组类型,直接拼接进文本会显示Array,这就是你收到的邮件里附件部分异常的核心原因
修改后的PHP代码
<?php $name = $_POST['name'] ?? ''; $contact = $_POST['contact'] ?? ''; // 收集上传的有效文件 $files = []; foreach (['file1', 'file2', 'file3'] as $field) { if (!empty($_FILES[$field]['tmp_name']) && $_FILES[$field]['error'] === UPLOAD_ERR_OK) { $files[] = [ 'name' => $_FILES[$field]['name'], 'tmp_path' => $_FILES[$field]['tmp_name'], 'type' => $_FILES[$field]['type'] ?? 'application/octet-stream' ]; } } $to = "my@email.com"; $subject = "New Form Received!"; $from = "noreply@email.com"; $cc = "private-sender@gmail.com"; // 构建MIME边界 $boundary = md5(uniqid(time())); // 邮件头部 $headers = "From: $from\r\n"; $headers .= "CC: $cc\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; $headers .= "\r\nThis is a multi-part message in MIME format.\r\n"; // 文本内容部分 $message = "--$boundary\r\n"; $message .= "Content-Type: text/plain; charset=utf-8\r\n"; $message .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $message .= "Name = $name\r\n"; $message .= "Contact = $contact\r\n\r\n"; // 添加附件 foreach ($files as $file) { $file_content = file_get_contents($file['tmp_path']); $encoded_content = chunk_split(base64_encode($file_content)); $message .= "--$boundary\r\n"; $message .= "Content-Type: {$file['type']}; name=\"{$file['name']}\"\r\n"; $message .= "Content-Disposition: attachment; filename=\"{$file['name']}\"\r\n"; $message .= "Content-Transfer-Encoding: base64\r\n\r\n"; $message .= $encoded_content . "\r\n"; } // 结束边界 $message .= "--$boundary--"; // 发送邮件 if (!empty($contact)) { mail($to, $subject, $message, $headers); } header("Location: Success.html"); exit; ?>
关键说明
- MIME多部分格式:通过定义
boundary分隔邮件的文本内容和附件,让邮件客户端能正确识别不同组成部分 - 文件有效性验证:只处理上传状态为
UPLOAD_ERR_OK的文件,避免处理错误或未上传的文件 - Base64编码:附件内容必须经过Base64编码后嵌入邮件,否则会出现乱码或无法识别的问题
- 空值处理:使用
??运算符处理表单字段空值,避免未定义索引报错
内容的提问来源于stack exchange,提问作者Vladimir Sanchez
相关产品推荐
相关产品推荐

