使用 `file_get_contents()` 直接读取含 php 代码的模板文件会导致源码暴露;应改用输出缓冲(output buffering)配合 `include`,让 php 解析并执行模板中的逻辑,最终获取渲染后的 html 内容。
在 PHPMailer 中动态加载邮件模板时,若模板文件(如 template.php)包含 PHP 代码(例如变量输出、条件判断或循环),直接用 file_get_contents() 读取会将其作为纯文本返回——PHP 标签 及其内容不会被解析,而是原样出现在邮件正文中,造成安全风险与功能失效。
✅ 正确做法:使用输出缓冲 + include
include 会实际执行 PHP 文件中的代码,而 ob_start() / ob_get_clean() 能捕获其输出结果(即执行后生成的

$template_file = 'PHPMailer/template.php';
if (!file_exists($template_file)) {
die("Unable to locate the template file");
}
// 启动输出缓冲,引入并执行模板文件,捕获执行结果
ob_start();
include $template_file;
$mail_template = ob_get_clean();
// ✅ $mail_template 现在是执行后的 HTML 字符串(如 "Some words here"),不含任何 PHP 标签⚠️ 注意事项:
变成 zuojiankuohaophpcnpyoujiankuohaophpcn),导致邮件显示为源码文本。
? 进阶建议:
可封装为可复用函数,支持传参(如 $data = ['name' => 'Alice']),并在模板中通过 extract($data) 使用:
function renderTemplate($file, $data = []) {
if (!file_exists($file)) return '';
extract($data); // 将数组键转为变量
ob_start();
include $file;
return ob_get_clean();
}
// 使用:$mail_template = renderTemplate('PHPMailer/template.php', ['username' => 'John']);这样既保障了 PHP 逻辑正常执行,又保持了模板的灵活性与安全性。