PHPMailer将require引入的模板赋值给Body时仅显示'1'问题求解
问题原因
PHP 中 require 语句的默认返回值为布尔值 true,打印输出时会被自动转换为字符串 1;仅当被引入的文件中主动使用 return 语句返回指定内容时,才会将 return 的值作为 require 的执行结果返回。
你观察到的 echo $template 可以输出完整模板内容属于错觉:你的模板文件中直接编写了裸HTML代码/内置了输出逻辑,在执行 $template = require(xxx) 这一步时,模板内容就已经被直接输出到了响应流中,并非 $template 变量存储了模板内容,此时 $template 变量本身的值始终是 1,因此赋值给 $mail->Body 时最终只会显示字符1。
解决方案
你可以选择两种方案修复该问题:
- 方案1:使用输出缓冲区捕获模板内容(无需修改原有模板)
通过PHP输出控制函数直接捕获require过程中输出的模板内容,赋值给变量即可:
// 开启输出缓冲区 ob_start(); require '../../template/newsletter/template_1.php'; // 获取缓冲区内容并清空缓冲区 $template = ob_get_clean(); // 正常赋值给邮件Body即可 $mail->Body = $template;
- 方案2:修改模板文件主动返回内容
在模板文件中将所有模板内容拼接为字符串后,通过return语句返回,即可让require语句直接返回模板内容:
// template_1.php 文件内部示例代码 $html = <<<HTML <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> </head> <body> <h2>您好</h2> <p>这是邮件正文内容</p> </body> </html> HTML; return $html;
额外提示:如果你的模板是HTML格式,需要给PHPMailer开启HTML解析配置,避免标签被直接当成纯文本展示:
$mail->isHTML(true);
内容的提问来源于stack exchange,提问作者Ygg69
相关产品推荐
相关产品推荐

