
本文介绍在使用 phpmailer 发送邮件时,如何正确加载并执行含 php 逻辑的模板文件(如 `template.php`),避免 `file_get_contents()` 直接暴露 php 源码,推荐使用输出缓冲(output buffering)配合 `include` 实现动态渲染。
在你当前的代码中,file_get_contents('PHPMailer/template.php') 只是将 template.php 文件作为纯文本读取——包括其中的 标签和 PHP 语句本身,因此邮件正文会显示类似 words here'; ?> 的原始代码,而非执行后的结果(如 “Some words here”)。这不仅影响功能,更存在安全隐患(如泄露逻辑、路径、变量名等)。
✅ 正确做法:使用 输出缓冲 + 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/文本,不含任何 PHP 标签? 关键说明:
- include 是语言结构,能真正解析并运行 PHP 代码;
- ob_start() 开启缓冲后,所有 echo、print 或 HTML 输出均被暂存于内存;
- ob_get_clean() 返回缓冲内容并清空缓冲区,确保无意外输出干扰邮件发送流程;
- 不要对 $mail_template 再调用 htmlspecialchars() —— 否则会把本该渲染的 HTML 标签(如
、
)转义为纯文本,导致邮件显示为源码而非格式化内容(除非你明确需要纯文本邮件)。
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 确保 template.php 中的变量(如 $forexample)在 include 前已定义或可在作用域中访问;若需传参,建议封装为函数或使用 extract($data) 预载变量;
- 模板文件中应避免 exit、die 或未捕获异常,否则会中断邮件发送流程;
- 生产环境建议对模板路径做白名单校验,防止路径遍历攻击(例如禁止 ../ 或绝对路径);
- 若模板含大量逻辑,推荐升级为轻量模板引擎(如 Twig 或 Plates),兼顾安全性与可维护性。
✅ 示例修正后的 template.php(仅输出,不暴露逻辑):
Welcome!
Dear user, your code executed successfully: = htmlspecialchars($forexample ?? 'default') ?>
这样,当 $forexample = 'Hello from PHP!'; 在 mail.php 中定义后,$mail_template 将得到渲染后的 HTML 字符串,完美嵌入 PHPMailer 邮件正文。











