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

