
CodeIgniter 4 默认以纯文本方式发送邮件,若未显式设置邮件类型为 HTML,即使邮件内容含 、 等标签,也会被当作普通文本渲染,导致收件人看到原始 HTML 源码而非格式化内容。
codeigniter 4 默认以纯文本方式发送邮件,若未显式设置邮件类型为 html,即使邮件内容含 `
`、`
` 等标签,也会被当作普通文本渲染,导致收件人看到原始 html 源码而非格式化内容。
在 CodeIgniter 4 中,邮件类(Email)默认使用 text/plain 内容类型发送,这意味着即使你传入的是包含 HTML 标签的字符串(如 <p>Hello<br>World</p>),系统也不会自动将其识别为 HTML 邮件——它只是原样输出,且未设置 Content-Type: text/html 响应头,因此邮箱客户端(如 Gmail、Outlook)会按纯文本解析,直接显示标签源码。
✅ 正确做法是显式声明邮件类型为 HTML,有两种推荐方式:
方式一:全局配置(推荐)
编辑 app/Config/Email.php 文件,找到 $mailType 属性并设为 'html':
public $mailType = 'html';
该配置会在整个应用中生效,所有通过 Services::email() 创建的实例都将默认以 HTML 模式发送。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
立即学习“前端免费学习笔记(深入)”;
方式二:运行时动态设置(适用于临时或差异化场景)
在调用 send() 前,使用 initialize() 方法覆盖配置:
$email = \Config\Services::email();
// 可选:单独为本次邮件指定 HTML 类型
$config = ['mailType' => 'html'];
$email->initialize($config);
$email->setFrom($settings->info->site_noreply_email, $settings->info->site_title)
->setTo($emailTo)
->setSubject($subject)
->setMessage($body); // 注意:$body 应为合法 HTML 字符串(无需额外转义)
if (!$email->send()) {
log_message('error', 'Email send failed: ' . $email->printDebugger(['headers']));
}⚠️ 注意事项:
-
setMessage()传入的内容必须是未经 HTML 实体编码的原始 HTML 字符串(例如用<br>而非<br>); - 若使用视图生成邮件内容(如
view('emails/password_reset')),请确保视图文件中直接输出 HTML,且控制器中用view()渲染后赋值给$body; - 在共享主机上,还需确认服务器支持
mail()函数或已正确配置 SMTP(如 PHPMailer 或 Sendmail),但本问题核心在于mailType设置,与传输协议无关; - 调试时可调用
$email->printDebugger()查看完整邮件头和正文,验证Content-Type: text/html是否已生效。
✅ 总结:只需一行关键配置 public $mailType = 'html';,即可让 CodeIgniter 4 正确发送 HTML 邮件——这是最常见却极易被忽略的配置项。部署到生产环境(尤其是共享主机)前,请务必检查此项。


















