You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHPMailer发送HTML或PHP脚本模板的邮件

你当前的写法直接将文件名赋值给$mail->Body无法实现模板加载,只会把文件名作为邮件内容输出,以下是几种可行的实现方案:

方案1:加载静态HTML模板

适合没有动态变量的纯静态HTML邮件模板,直接读取文件内容即可:

// 开启PHPMailer的HTML解析模式,必须设置
$mail->isHTML(true);

$htmlTemplatePath = 'message.html';
if (file_exists($htmlTemplatePath)) {
    $mail->Body = file_get_contents($htmlTemplatePath);
} else {
    // 模板不存在时的兜底内容
    $mail->Body = "邮件内容加载失败";
}

方案2:加载带动态逻辑的PHP模板

适合需要插入变量、循环渲染等动态逻辑的PHP模板,使用输出缓冲捕获PHP运行后的HTML内容:

$mail->isHTML(true);

$phpTemplatePath = 'message.php';
if (file_exists($phpTemplatePath)) {
    // 提前定义模板需要用到的变量
    $userName = "收件人姓名";
    $orderInfo = [
        "id" => "123456",
        "amount" => "99.00"
    ];

    // 开启输出缓冲
    ob_start();
    // 引入PHP模板执行,渲染的内容会存入缓冲区
    include $phpTemplatePath;
    // 取出缓冲区内容并清空缓冲区
    $mail->Body = ob_get_clean();
}

方案3:占位符替换方案

如果不想在模板中嵌入PHP代码,可以在静态HTML中设置自定义占位符,读取后批量替换:

  1. 先在HTML模板中写入占位符,比如{{user_name}}、{{order_id}}
  2. 读取模板后替换变量即可:
$mail->isHTML(true);

$htmlContent = file_get_contents('message.html');
$replaceMap = [
    '{{user_name}}' => "张三",
    '{{order_id}}' => "123456",
    '{{pay_time}}' => date("Y-m-d H:i:s")
];
$mail->Body = strtr($htmlContent, $replaceMap);

注意事项

  • 建议同时设置纯文本兜底内容,适配不支持HTML的邮件客户端:$mail->AltBody = strip_tags($mail->Body);,也可以手动编写纯文本版本
  • 模板中的图片资源建议使用公开可访问的绝对URL,不要使用本地路径,也可以通过PHPMailer的addEmbeddedImage方法嵌入内嵌图片
  • 邮件HTML模板要做客户端兼容,尽量使用行内样式,不要引用外部CSS文件,布局优先使用table实现,避免使用flex、grid等新CSS特性

内容的提问来源于stack exchange,提问作者Sergio Martínez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 23:24:06