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

使用PHPMailer发送动态修改内容的HTML附件失败问题求助

问题分析与修复代码

原代码存在几个关键逻辑错误,导致附件无法正常发送:

  • 数组索引错误:获取上传文件临时路径时未指定循环索引[$i],导致拿到的是整个临时路径数组而非单个文件路径。
  • file_put_contents参数颠倒:该函数第一个参数是目标文件名,第二个是要写入的内容,原代码参数顺序搞反,且错误地将写入结果(字节数)作为文件路径传入AddAttachment。
  • 临时文件处理不当:修改后的内容未正确保存为可被PHPMailer读取的文件,或未直接传递修改后的字符串内容。

修复方案一:使用临时文件保存修改后的内容

for ($i = 0; $i < count($_FILES['attachment']['name']); $i++) {
    if (!empty($_FILES['attachment']['tmp_name'][$i])) {   
        // 获取单个上传文件的临时路径
        $tempFilePath = $_FILES['attachment']['tmp_name'][$i];
        // 读取文件内容
        $attStr = file_get_contents($tempFilePath);
        // 替换占位符
        $attStrNew = str_replace("[-email-]", $email, $attStr);
        
        // 创建临时文件保存修改后的内容
        $modifiedTempFile = tempnam(sys_get_temp_dir(), 'att_');
        file_put_contents($modifiedTempFile, $attStrNew);
        
        // 添加修改后的附件
        $mail->AddAttachment($modifiedTempFile, $_FILES['attachment']['name'][$i]);
        
        // 可选:发送后自动删除临时文件
        register_shutdown_function('unlink', $modifiedTempFile);
    }
}

修复方案二:直接传递字符串内容(更简洁)

PHPMailer提供了AddStringAttachment方法,可直接传入修改后的字符串作为附件,无需创建临时文件:

for ($i = 0; $i < count($_FILES['attachment']['name']); $i++) {
    if (!empty($_FILES['attachment']['tmp_name'][$i])) {   
        $tempFilePath = $_FILES['attachment']['tmp_name'][$i];
        $attStr = file_get_contents($tempFilePath);
        $attStrNew = str_replace("[-email-]", $email, $attStr);
        
        // 直接添加字符串作为附件,指定文件名和MIME类型
        $mail->AddStringAttachment($attStrNew, $_FILES['attachment']['name'][$i], 'base64', 'text/html');
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 02:35:19