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

PHPMailer接收HTML表单上传文件添加附件失效如何修复

故障原因

代码存在3个核心问题,直接导致附件功能失效:

  • addAttachment()传参错误:PHPMailer的addAttachment()方法第一个参数要求传入文件的服务器存储路径,你直接传入了$_FILES['file']整个数组——这个数组是PHP上传文件的信息集合,包含临时路径、原文件名、错误码、文件大小等多个字段,直接传数组方法完全无法识别文件位置。
  • SMTP配置重复冲突:你先后两次给$mail->SMTPSecure赋值,前一次的SMTPS配置被后一次的tls配置覆盖,虽然587端口对应tls是正确的,但重复冗余配置容易引发兼容问题。
  • 缺少上传校验逻辑:你没有判断文件是否上传成功,不管用户有没有选文件、文件上传有没有报错,都会直接执行添加附件逻辑,很容易触发异常。
修改方案

按照以下步骤调整即可实现附件发送:

  • 调用addAttachment()时,第一个参数传上传文件的临时路径$_FILES['file']['tmp_name'],第二个参数传原文件名$_FILES['file']['name'],这样收件人收到的附件会显示用户上传的原始名称。
  • 删除重复的$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;配置,保留tls配置对应587端口即可。
  • 增加上传状态判断:先校验$_FILES['file']['error']值是否等于UPLOAD_ERR_OK(常量值为0,代表文件上传无错误),确认上传成功后再执行添加附件操作。
  • 可选补充:增加文件大小、格式校验,避免用户上传超量或不符合要求的文件导致发送失败。
修正后的PHP代码
<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'PHPMailer/Exception.php';
require 'PHPMailer/PHPMailer.php';
require 'PHPMailer/SMTP.php';

$mail = new PHPMailer(true);

try {
    $mail->SMTPDebug = 0;  
    $mail->CharSet = 'UTF-8';                    
    $mail->isSMTP();                                            
    $mail->Host       = 'smtp.gmail.com';                     
    $mail->SMTPAuth   = true;                                   
    $mail->Username   = 'myemail@gmail.com';                   
    // 注意:Gmail需开启两步验证后使用应用专用密码,无法直接使用账号登录密码
    $mail->Password   = 'mypassword';                            
    $mail->SMTPSecure = 'tls';            
    $mail->Port       = 587; 

    $mail->setFrom('myemail@gmail.com');
    $mail->addAddress('mailreceiver@gmail.com'); 

    $mail->isHTML(true);    
    
    $mail->Subject = $_POST['subject'];
    $mail->Body = $_POST['message'];

    // 校验文件上传状态,无错误才添加附件
    if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) {
        $mail->addAttachment(
            $_FILES['file']['tmp_name'],
            $_FILES['file']['name']
        );
    }

    $mail->send();
    echo "邮件发送成功";

} catch (Exception $e) {
    echo "邮件发送失败,错误信息:{$mail->ErrorInfo}";
}
?>
其他说明
  • 你写的HTML表单已经正确配置了enctype="multipart/form-data"属性,这部分不需要修改,完全符合文件上传要求。
  • 如果要限制附件大小,可在添加附件前判断$_FILES['file']['size'],例如限制单附件不超过10MB,可判断$_FILES['file']['size'] < 10 * 1024 * 1024,不符合要求就返回错误提示。

内容的提问来源于stack exchange,提问作者emiliorivas16

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:30:46