Drupal 9升级PHP 8后邮件附件无法发送问题求助
Drupal 9 + PHP 8 升级后带附件邮件发送失败的解决办法
错误核心分析
报错PHPMailer\PHPMailer\Exception: Could not access file:说明PHPMailer无法读取指定的附件文件,结合Drupal 9和PHP 8的特性变化,主要排查以下几个方向:
1. 文件权限与归属问题
- PHP 8对文件系统权限的校验更严格,确认web服务器运行用户(如
www-data、apache)拥有附件文件及所在目录的读取权限 - 执行以下命令修复常见目录权限:
# 设置临时文件目录权限 chmod 755 sites/default/files/tmp chown www-data:www-data sites/default/files/tmp # 设置附件存储目录权限 chmod 755 sites/default/files/attachments chown www-data:www-data sites/default/files/attachments - 单个附件文件权限建议设置为
644,确保web用户能读取
2. 附件路径传递错误
错误信息中Could not access file:后为空,说明传递给addAttachment()的路径是空值,需检查业务代码:
- 确认Drupal 9中文件路径的获取方式正确,推荐使用:
// 获取文件实体的本地真实路径 $file = \Drupal\file\Entity\File::load($fid); $real_path = \Drupal::service('file_system')->realpath($file->getFileUri()); // 将正确路径传入邮件附件方法 $mailManager->mail(..., ['attachment_path' => $real_path], ...); - 排查自定义模块或主题中硬编码的文件路径,升级后可能因目录结构变化导致路径失效
3. PHPMailer版本兼容性
- 若项目中使用了第三方模块替换默认PHPMailer,执行命令更新至适配PHP 8的稳定版本:
composer update phpmailer/phpmailer --with-all-dependencies - 确保更新后的版本与Drupal 9核心版本兼容,避免版本冲突
4. PHP open_basedir 限制
- 检查php.ini中的
open_basedir配置,确认附件所在目录(含临时文件目录)被包含在允许的路径列表中 - 若需调整,修改php.ini后重启web服务器生效
内容的提问来源于stack exchange,提问作者thulasiraman
相关产品推荐
相关产品推荐

