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

PHP formHandler实现单表单多图片邮件发送方法求助

多图上传邮件发送修改方案

问题核心

当文件上传字段名以[]结尾(即你前端写的name="userImages[]")时,PHP接收的$_FILES['userImages']会从单文件的键值对结构,变为多文件的嵌套数组结构:

  • 单文件场景:$_FILES['userImages']['name']是字符串类型的单个文件名
  • 多文件场景:$_FILES['userImages']['name']是数组类型,包含所有上传文件的文件名,tmp_name、error等属性同理

你原有代码是按单文件结构写的,直接把数组当字符串读取、只拼接一个附件段,自然无法正常发送多图。

修改后可用代码

你的前端表单代码无需调整,直接替换formHandler.php的全部内容即可:

<?php
////////////////////////////////////////////////////////////////////////////
// 接收普通表单字段
$name = trim($_POST['userName']);
$email = trim($_POST['userEmail']);
$userImages = $_FILES['userImages'];
////////////////////////////////////////////////////////////////////////////

$composition =
"\r\n\n\nName: " . $name .
"\r\nEmail Address: " . $email;

////////////////////////////////////////////////////////////////////////////
$subject = "Form Submission";
$fromname = $name;
$fromemail = $email;
$mailto = 'receiving@email.com';
////////////////////////////////////////////////////////////////////////////

$separator = md5(time());
$eol = "\r\n";

// 组装邮件头
$headers = "From: ".$fromname." <".$fromemail.">" . $eol;
$headers .= "MIME-Version: 1.0" . $eol;
$headers .= "Content-Type: multipart/mixed; boundary=\"" . $separator . "\"" . $eol;
$headers .= "Content-Transfer-Encoding: 7bit" . $eol;
$headers .= "This is a MIME encoded message." . $eol;

// 拼接邮件正文文本部分
$body = "--" . $separator . $eol;
$body .= "Content-Type: text/plain; charset=\"utf-8\"" . $eol;
$body .= "Content-Transfer-Encoding: 8bit" . $eol;
$body .= $composition . $eol;

// 循环处理所有上传的图片
foreach ($userImages['error'] as $index => $error) {
    // 自动跳过上传出错的文件
    if ($error !== UPLOAD_ERR_OK) {
        continue;
    }
    // 读取当前索引对应的文件信息
    $tmpFilePath = $userImages['tmp_name'][$index];
    $originalFileName = $userImages['name'][$index];
    // 编码文件内容
    $fileContent = file_get_contents($tmpFilePath);
    $fileContent = chunk_split(base64_encode($fileContent));
    // 拼接当前图片的附件段
    $body .= "--" . $separator . $eol;
    $body .= "Content-Type: application/octet-stream; name=\"" . $originalFileName . "\"" . $eol;
    $body .= "Content-Transfer-Encoding: base64" . $eol;
    $body .= "Content-Disposition: attachment; filename=\"" . $originalFileName . "\"" . $eol;
    $body .= $fileContent . $eol;
}

// 拼接MIME结束分隔符
$body .= "--" . $separator . "--";

////////////////////////////////////////////////////////////////////////////
// 发送邮件
mail($mailto, $subject, $body, $headers);
////////////////////////////////////////////////////////////////////////////
// 提交成功后跳转
header('location: /formSent_confirmationPage.php');
?>

优化点说明

  • 补全了多文件遍历逻辑,支持任意数量的上传图片作为附件发送
  • 新增上传错误校验,自动跳过传输失败的文件,避免文件读取报错
  • 将原代码的iso-8859-1字符集替换为utf-8,后续新增中文字段不会出现乱码
  • 补全了附件头的filename参数,所有邮箱客户端都能正常识别附件原名
  • 移除了原代码中@错误屏蔽符,如果发送失败可以直接看到PHP报错,方便排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:36:25