本文目录导读:

在PHP项目中渲染邮件模板的动态内容,通常有几种成熟的方法,以下是几种主流且推荐的实现方式:
使用原生PHP语法(最简单)
将模板保存为.php文件,直接使用include或require,配合ob_start()捕获输出。
模板文件 email_template.php:
<!DOCTYPE html>
<html>
<head><?= htmlspecialchars($subject) ?></title>
</head>
<body>
<h1>你好,<?= htmlspecialchars($username) ?>!</h1>
<p>你的验证码是:<strong><?= htmlspecialchars($verificationCode) ?></strong></p>
<p>有效期至:<?= date('Y-m-d H:i:s', $expireTime) ?></p>
</body>
</html>
渲染代码:
function renderEmailTemplate($username, $verificationCode, $expireTime, $subject) {
ob_start();
include 'email_template.php';
return ob_get_clean();
}
// 使用
$htmlContent = renderEmailTemplate('张三', '123456', time() + 3600, '账号验证');
优点:零依赖,简单直接
缺点:模板中PHP代码可能造成安全风险,需注意变量转义
使用模板引擎(推荐)
1 Twig(最流行)
安装:
composer require twig/twig
模板 email_template.twig:
<!DOCTYPE html>
<html>
<head>{{ subject|e }}</title>
</head>
<body>
<h1>你好,{{ username|e }}!</h1>
<p>你的验证码是:<strong>{{ verificationCode|e }}</strong></p>
<p>有效期至:{{ expireTime|date('Y-m-d H:i:s') }}</p>
</body>
</html>
渲染代码:
use Twig\Loader\FilesystemLoader;
use Twig\Environment;
$loader = new FilesystemLoader('/path/to/templates');
$twig = new Environment($loader, [
'cache' => '/path/to/cache', // 生产环境启用
'autoescape' => 'html', // 自动转义
]);
$htmlContent = $twig->render('email_template.twig', [
'username' => '张三',
'verificationCode' => '123456',
'expireTime' => time() + 3600,
'subject' => '账号验证'
]);
优点:自动转义防XSS,模板继承,过滤器丰富,性能好(有缓存)
2 Blade(Laravel用户推荐)
如果已经在用Laravel:
// 在Mailables中使用
use Illuminate\Mail\Mailable;
class VerificationEmail extends Mailable
{
public $username;
public $verificationCode;
public function build()
{
return $this->view('emails.verification')
->with([
'username' => $this->username,
'verificationCode' => $this->verificationCode
]);
}
}
模板 resources/views/emails/verification.blade.php:
<!DOCTYPE html>
<html>
<head>{{ $subject }}</title>
</head>
<body>
<h1>你好,{{ $username }}!</h1>
<p>你的验证码是:<strong>{{ $verificationCode }}</strong></p>
</body>
</html>
使用字符串替换(最基础但不够灵活)
适用于简单、固定的模板:
function renderSimpleTemplate($template, $data) {
$search = array_map(function($key) {
return '{{' . $key . '}}';
}, array_keys($data));
return str_replace($search, array_values($data), $template);
}
$template = '<h1>你好,{{username}}!验证码:{{code}}</h1>';
$htmlContent = renderSimpleTemplate($template, [
'username' => '张三',
'code' => '123456'
]);
不推荐:无自动转义,不支持循环/条件逻辑。
使用专用邮件模板库
PHPMailer + 自定义模板
use PHPMailer\PHPMailer\PHPMailer;
$mail = new PHPMailer(true);
$mail->isHTML(true);
// 读取模板
$template = file_get_contents('template.html');
// 渲染(使用字符串替换或正则)
$body = str_replace(['{{username}}', '{{code}}'], ['张三', '123456'], $template);
$mail->Body = $body;
最佳实践建议
安全注意事项
- 始终转义HTML输出:使用
htmlspecialchars()或模板引擎的自动转义 - 验证变量来源:不要直接信任用户输入
- 防止XSS注入:尤其当模板内容包含用户生成内容时
性能优化
- 缓存编译后的模板(Twig默认支持)
- 避免在循环中渲染模板
- 使用连接池发送邮件,避免每次发送都重新连接SMTP
模板管理
- 按类型分类:验证码、通知、营销等
- 支持多语言:配合
gettext或语言文件 - 预测试模板:发测试邮件前先预览
完整示例(Twig + PHPMailer)
require 'vendor/autoload.php';
// 1. 配置Twig
$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/templates');
$twig = new \Twig\Environment($loader, [
'cache' => __DIR__ . '/cache/twig',
'autoescape' => 'html',
]);
// 2. 渲染模板
$emailBody = $twig->render('welcome.twig', [
'username' => '新用户',
'activationLink' => 'https://example.com/activate?token=abc123'
]);
// 3. 发送邮件
$mail = new PHPMailer\PHPMailer\PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'noreply@example.com';
$mail->Password = 'password';
$mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;
$mail->setFrom('noreply@example.com', '系统通知');
$mail->addAddress('user@example.com', '用户');
$mail->Subject = '欢迎注册';
$mail->isHTML(true);
$mail->Body = $emailBody;
$mail->send();
对于新项目,强烈推荐使用Twig,如果你的项目已经在用框架(如Laravel、Symfony),使用框架自带的模板引擎即可,对于简单场景,原生PHP语法配合ob_start()是最快的方式。