使用PHPMailer发送邮件时附件无实体文件问题求助
解决PHPMailer发送附件仅显示标识无实体文件的问题
我之前也碰到过几乎一模一样的坑!你试的几种写法本身逻辑没问题,但大概率是细节上的疏漏导致的,咱们一步步排查:
1. 先补一个最容易忽略的语法错误
你写的$_SERVER[DOCUMENT_ROOT]里的键没有加引号!PHP会把DOCUMENT_ROOT当成一个常量来解析,而不是字符串键,这会直接导致路径拼接出错。所有$_SERVER的键都要加单引号或双引号:
$mail->AddAttachment($_SERVER['DOCUMENT_ROOT'].'/test.pdf','doklad.pdf');
这是很多新手容易踩的坑,先把这个改了再说。
2. 验证文件路径的正确性和可读性
即使路径写法对了,也得确认文件真的在那个位置,而且web服务器有权限读取它:
- 先输出完整路径看看:
把输出的路径复制到浏览器地址栏(或者服务器的文件管理器),看看能不能正常打开文件。$filePath = $_SERVER['DOCUMENT_ROOT'].'/test.pdf'; echo $filePath; - 检查文件权限:确保web服务器的运行用户(比如
www-data、apache)对这个文件有读权限,可以用chmod 644 test.pdf来设置合理的权限。
3. 开启PHPMailer调试模式抓错误
PHPMailer本身会输出详细的错误信息,但默认是关闭的。开启调试模式能直接看到添加附件或发送过程中哪里出问题了:
$mail->SMTPDebug = 2; // 2级会显示完整的SMTP交互日志 $mail->Debugoutput = 'html'; // 以HTML格式输出日志,方便查看
运行代码后,你会看到类似“无法打开文件”“权限不足”的明确提示,这比瞎试写法高效多了。
4. 针对AddStringAttachment的额外检查
如果你用AddStringAttachment,先确认file_get_contents真的读取到了文件内容:
$fileContent = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/test.pdf'); if ($fileContent === false) { die('读取附件文件失败,请检查路径和权限'); } $mail->AddStringAttachment($fileContent,'doklad.pdf','base64','application/pdf');
如果file_get_contents返回false,说明文件根本读不到,自然附件是空的。
5. 排查服务器环境限制
有些服务器会开启open_basedir限制,禁止PHP读取指定目录外的文件。你可以用phpinfo()查看当前的open_basedir设置,确保你的test.pdf在允许的目录范围内。
按照上面的步骤排查,90%的概率能解决问题!我当初就是因为没加$_SERVER键的引号,折腾了好半天😂
内容的提问来源于stack exchange,提问作者Mír Oslav
相关产品推荐
相关产品推荐

