如何使用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中设置自定义占位符,读取后批量替换:
- 先在HTML模板中写入占位符,比如
{{user_name}}、{{order_id}} - 读取模板后替换变量即可:
$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
相关产品推荐
相关产品推荐

