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

PHPmailer多附件邮件发送问题:特定表单提交失败排查

特定表单邮件附件提交失败的问题分析与修复方案

问题情况

多数表单提交后能正常发送带附件的邮件,但某特定表单提交时邮件发送失败并报错;硬编码添加附件的注释代码运行正常,需要复用统一的多附件处理逻辑适配所有表单。

相关代码片段

if (!!$filename) {
    if(str_contains($filename, '#')){
        $filename_arr = explode("#",$filename);  
        $target_path_arr = explode("#",$target_path);
        
        foreach( $filename_arr as $k => $v ){
            $mail->addAttachment($target_path_arr[$k], $v); 
        }     
        // $mail->addAttachment($_SERVER['DOCUMENT_ROOT'] . "/document/mobile-app-requirements-specifications-document-template.docx", "mobile-app-requirements-specifications-document-template.docx");
        // $mail->addAttachment($_SERVER['DOCUMENT_ROOT'] . "/document/Agicent-General-Capabilities-Presentation-2022.pdf","Agicent-General-Capabilities-Presentation-2022.pdf");
        // $mail->addAttachment($_SERVER['DOCUMENT_ROOT'] . "/document/5-Points-committment.png", "5-Points-committment.png");
    }else{
        $mail->addAttachment($target_path, $filename);
    }
}

可能的问题根源

  1. 数组索引越界:$filename和$target_path用#分割后,两个数组的元素数量可能不一致,循环时$target_path_arr[$k]会访问不存在的索引,直接报错中断邮件发送。
  2. 路径无效:特定表单传入的$target_path是相对路径或错误路径,而注释里用的是绝对路径,导致文件找不到。
  3. PHP版本兼容问题:如果服务器PHP版本低于8.0,str_contains函数不存在,直接触发致命错误,而硬编码部分不需要这个函数所以能正常运行。
  4. 文件不可读:目标文件存在但没有读取权限,addAttachment执行失败导致邮件发送中断。

修复后的统一逻辑代码

if (!!$filename) {
    // 替换str_contains兼容PHP8.0以下版本
    if (strpos($filename, '#') !== false) {
        $filename_arr = explode("#", $filename);  
        $target_path_arr = explode("#", $target_path);
        
        // 先校验数组长度一致,避免索引越界
        if (count($filename_arr) === count($target_path_arr)) {
            foreach ($filename_arr as $k => $v) {
                // 统一拼接绝对路径,和注释里的硬编码逻辑对齐
                $absolute_path = $_SERVER['DOCUMENT_ROOT'] . '/' . ltrim($target_path_arr[$k], '/');
                // 检查文件存在且可读
                if (file_exists($absolute_path) && is_readable($absolute_path)) {
                    $mail->addAttachment($absolute_path, $v); 
                } else {
                    // 可选:记录错误日志,方便排查
                    error_log("无法添加附件:文件不存在或不可读 - {$absolute_path}");
                }
            }
        } else {
            error_log("附件文件名与路径数组长度不匹配");
        }
    } else {
        $absolute_path = $_SERVER['DOCUMENT_ROOT'] . '/' . ltrim($target_path, '/');
        if (file_exists($absolute_path) && is_readable($absolute_path)) {
            $mail->addAttachment($absolute_path, $filename);
        } else {
            error_log("无法添加单个附件:文件不存在或不可读 - {$absolute_path}");
        }
    }
}

修复说明

  • 统一使用绝对路径:和注释里的硬编码逻辑保持一致,避免相对路径导致的文件找不到问题。
  • 增加数组长度校验:防止因分割后的数组长度不一致引发的索引越界错误。
  • 兼容低版本PHP:用strpos替换str_contains,覆盖更多PHP版本环境。
  • 文件有效性检查:只对存在且可读的文件添加附件,单个附件异常不会中断整个邮件发送流程。
  • 错误日志记录:方便排查特定表单的附件问题,快速定位无效路径或权限问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:35:30