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

