You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:12:07