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

使用PHPMailer发送带附件邮件时数组传参报错排查

PHPMailer带附件发送报错:传入数组而非字符串

作为PHP新手,我严格按照PHPMailer官方示例代码实现带附件邮件发送功能,但相关文件上传函数(PHPMailer::mb_pathinfo、hash、move_uploaded_file)均报错,提示传入数组而非预期的字符串。通过var_dump发现$_FILES['files']['name']确实为数组(array(1) { [0]=> string(12) "Frame 39.png" })。我认为可能需要将其转为字符串,但示例代码无需此操作即可正常运行,请问我忽略了什么?

相关代码与错误信息

$ext = PHPMailer::mb_pathinfo($_FILES['files']['name'], PATHINFO_EXTENSION);
//PHP Warning:  preg_match() expects parameter 2 to be string, array given in /home1/public_html/PHPMailer/PHPMailer.php on line 4568

$uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['files']['name'])) . '.' . $ext;
//PHP Warning:  hash() expects parameter 2 to be string, array given in /home1/public_html/submit.php on line 58

if (move_uploaded_file($_FILES['files']['tmp_name'], $uploadfile)) { 
[...]
//PHP Warning:  move_uploaded_file() expects parameter 1 to be string, array given in /home1/public_html/submit.php on line 60

问题原因与解决方法

  • 核心原因:你的表单文件上传字段是多文件上传(比如name="files[]"),所以$_FILES返回数组结构;而PHPMailer官方示例用的是单文件上传(name="files"),示例代码直接按字符串处理即可,两者结构不匹配导致报错。

  • 解决方式二选一:

    1. 若需支持多文件上传,遍历数组逐个处理文件:
      foreach ($_FILES['files']['name'] as $key => $filename) {
          $ext = PHPMailer::mb_pathinfo($filename, PATHINFO_EXTENSION);
          $uploadfile = tempnam(sys_get_temp_dir(), hash('sha256', $filename)) . '.' . $ext;
          if (move_uploaded_file($_FILES['files']['tmp_name'][$key], $uploadfile)) {
              // 添加附件到邮件
              // $mail->addAttachment($uploadfile, $filename);
          }
      }
      
    2. 若只需单文件上传,修改HTML表单的文件字段,把name="files[]"改成name="files",即可直接复用官方示例代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 02:25:08