使用PHPMailer发送带附件邮件失败,请求排查代码问题
排查PHPMailer附件无法送达的问题
核心结论
发送带附件的邮件必须确保文件成功上传到服务器临时目录,PHP会自动处理临时上传,但需要前端和后端配合正确传递文件数据。
分步排查
1. 前端表单检查
确保表单设置了enctype="multipart/form-data",这是文件上传的必要属性:
<form id="contactForm" method="POST" enctype="multipart/form-data"> <!-- 表单字段 --> <input type="file" name="attachment" id="attachment"> <!-- 其他输入框 --> <button type="submit">发送</button> </form>
2. JS提交逻辑检查
必须使用FormData对象携带文件数据,不能用普通JSON序列化:
document.getElementById('contactForm').addEventListener('submit', function(e) { e.preventDefault(); const formData = new FormData(this); // 直接从表单创建FormData fetch('contact-form.php', { method: 'POST', body: formData // 不要手动设置Content-Type,浏览器会自动处理 }) .then(response => response.text()) .then(data => console.log(data)) .catch(error => console.error(error)); });
3. PHP后端处理检查
- 先通过
$_FILES数组确认文件上传状态:
// 检查文件是否上传成功 if (isset($_FILES['attachment']) && $_FILES['attachment']['error'] === UPLOAD_ERR_OK) { $tmpFilePath = $_FILES['attachment']['tmp_name']; $fileName = $_FILES['attachment']['name']; // 用PHPMailer添加附件 $mail->addAttachment($tmpFilePath, $fileName); } else { // 处理上传错误 echo '文件上传失败,错误码:' . $_FILES['attachment']['error']; }
- 确认
addAttachment第一个参数是服务器临时文件路径,第二个参数是收件人看到的文件名。 - 邮件发送完成后,PHP会自动清理临时文件,无需手动删除;若需保留文件,可通过
move_uploaded_file将其移至服务器永久目录。
常见错误点
- 前端表单未设置
enctype="multipart/form-data",导致文件数据无法传递到后端。 - JS提交时用
JSON.stringify处理数据,破坏文件二进制结构。 - PHP端错误使用
$_POST获取文件,而非$_FILES数组。 - 服务器临时目录权限不足,导致文件上传失败。
内容的提问来源于stack exchange,提问作者AndriiBal
相关产品推荐
相关产品推荐

