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

Sendgrid PHP/PHPMailer邮件无法添加附件问题求助

问题分析与解决方案

1. 附件未添加的核心问题

你代码里存在两个关键错误:

  • 第一次调用move_uploaded_file时,返回的$uploadfile是布尔值(成功返回true,失败返回false),并非文件路径
  • 紧接着用这个布尔值作为第二次move_uploaded_file的目标路径,会导致第二次调用必然失败,后续的addAttachment逻辑根本不会执行

修正后的代码

if (array_key_exists('fileinput_name', $_FILES)) {
    // 先定义目标文件的完整路径
    $targetPath = "uploadtmp/" . $_FILES["fileinput_name"]["name"];
    
    // 仅执行一次文件移动操作
    if (move_uploaded_file($_FILES['fileinput_name']['tmp_name'], $targetPath)) {
        // 添加附件:第一个参数是服务器上的文件路径,第二个是邮件中显示的文件名(可选)
        $mail->addAttachment($targetPath, $_FILES["fileinput_name"]["name"]);
    }
}

2. 邮件发送后删除文件的方法

邮件发送成功后,使用unlink()函数删除服务器上的文件,删除前建议先判断文件是否存在:

// 假设邮件发送成功的判断逻辑
if ($mail->send()) {
    $targetPath = "uploadtmp/" . $_FILES["fileinput_name"]["name"];
    if (file_exists($targetPath)) {
        unlink($targetPath);
    }
}

3. 无需上传到服务器直接添加附件的方案

不需要移动临时文件,直接使用PHP上传生成的临时文件路径(tmp_name)添加附件,PHP会在脚本执行结束后自动删除该临时文件:

if (array_key_exists('fileinput_name', $_FILES)) {
    $tmpFilePath = $_FILES['fileinput_name']['tmp_name'];
    $fileName = $_FILES['fileinput_name']['name'];
    
    // 直接用临时文件添加附件
    if (file_exists($tmpFilePath)) {
        $mail->addAttachment($tmpFilePath, $fileName);
    }
}

注意:必须确保邮件发送完成前,脚本没有提前终止(比如不要在addAttachment后立刻调用exit()或die(),要等$mail->send()执行完成)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:52:15