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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:27:35