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
相关产品推荐
相关产品推荐

