
Drupal 9 升级至 PHP 8 后,PHPMailer::addAttachment() 报错“Could not access file”,根本原因通常是文件路径无效或 Web 服务器无权读取附件文件,需重点检查文件权限、所有者及路径合法性。
drupal 9 升级至 php 8 后,`phpmailer::addattachment()` 报错“could not access file”,根本原因通常是文件路径无效或 web 服务器无权读取附件文件,需重点检查文件权限、所有者及路径合法性。
在 Drupal 9(尤其是搭配较新版本的 phpmailer/phpmailer v6.8+)与 PHP 8 共同运行时,邮件附件功能失效是一个典型环境适配问题。错误信息:
PHPMailer\PHPMailer\Exception: Could not access file: in PHPMailer\PHPMailer\PHPMailer->addAttachment() (line 3182 of vendor/phpmailer/phpmailer/src/PHPMailer.php)
表面看是 PHPMailer 抛出异常,但实际并非 PHPMailer 本身缺陷,而是它在调用 is_readable() 验证附件路径时返回 false —— 意味着该文件对当前 Web 进程(如 www-data、apache 或 nginx 用户)不可读。
✅ 关键排查步骤
-
确认文件路径是否真实存在且可读
在自定义邮件逻辑(如hook_mail_alter()或自定义邮件发送服务)中,打印并验证附件路径:$file_path = '/var/www/html/sites/default/files/my-report.pdf'; \Drupal::logger('email')->notice('Attachment path: @path, is_readable: @readable', [ '@path' => $file_path, '@readable' => is_readable($file_path) ? 'YES' : 'NO', ]);若日志显示
is_readable: NO,则进入下一步。 -
检查文件所有权与权限
- 执行命令确认文件归属(以 Debian/Ubuntu 为例):
ls -l /var/www/html/sites/default/files/my-report.pdf # 正确示例:-rw-r--r-- 1 www-data www-data 12345 Jun 10 10:30 my-report.pdf
- 若属主不是 Web 服务器用户(如
root或ubuntu),请修正:sudo chown www-data:www-data /var/www/html/sites/default/files/my-report.pdf sudo chmod 644 /var/www/html/sites/default/files/my-report.pdf
- 执行命令确认文件归属(以 Debian/Ubuntu 为例):
-
避免使用绝对路径陷阱
Drupal 中推荐通过文件 API 获取安全路径:use Drupal\file\Entity\File; $fid = 123; // 附件文件的文件 ID $file = File::load($fid); if ($file && $file->getFileUri()) { $real_path = \Drupal::service('file_system')->realpath($file->getFileUri()); if ($real_path && is_readable($real_path)) { $mail['params']['attachments'][] = [ 'filepath' => $real_path, 'filename' => $file->getFilename(), 'filemime' => $file->getMimeType(), ]; } }
⚠️ 注意事项
-
不要硬编码
/tmp/或用户家目录路径:Web 服务器通常无权访问非公开目录; -
禁用
open_basedir限制(如启用):检查php.ini中open_basedir是否排除了附件所在路径; -
容器/云环境需额外注意:Docker 中确保卷挂载权限正确;AWS EFS/S3 附件需通过流包装器(如
s3://)配合flysystem处理,不能直接传本地路径。
✅ 总结
该问题本质是文件系统访问控制问题,而非 PHPMailer 或 Drupal 核心 Bug。升级 PHP 8 后,is_readable() 行为更严格,旧有宽松权限配置(如 777 目录 + root 所有者)将立即暴露风险。坚持“最小权限原则”——让 Web 用户仅拥有必要读取权限,并始终通过 Drupal 文件 API 解析 URI,可彻底规避此类故障。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











