CodeIgniter 3 发 HTML 邮件需显式设置 mailtype 为 'html',中文主题与正文编码必须统一为小写 'utf-8',否则乱码或拒收;视图嵌入需防 BOM、禁外链;调试须确保无前置输出且换行符为 "\r\n"。

CodeIgniter 3 的 Email 类默认发的是纯文本邮件,要发 HTML 邮件,必须显式设置 mailtype 为 'html',且中文主题、正文编码必须统一为小写 'utf-8',否则收件方看到乱码或被拒收。
为什么 $this->email->message('<h1>你好</h1>') 还是显示源码?
不是 HTML 渲染失败,而是没告诉 Email 类“这是一封 HTML 邮件”。CI 不会自动检测内容格式,必须手动开关:
-
$this->email->set_mailtype('html')或初始化时在配置数组里加'mailtype' => 'html' - 漏掉这步,哪怕内容全是标签,也会被当作文本处理,
<h1>就真显示成六个字符 - 部分邮箱(如 Outlook)对
Content-Type头不严格,但 QQ 邮箱、iCloud 会直接拒渲染——这不是兼容性问题,是协议层面没达标
HTML 邮件发出去但中文主题乱码怎么办?
主题乱码和正文乱码原因不同:正文靠 charset 控制,主题还得额外过一遍 MIME 编码。常见错误是只设了 'charset' => 'UTF-8'(大写)或漏掉主题编码声明:
-
charset值必须小写:'utf-8',CI 内部拼接头时会校验字符串字面量 - 主题必须用
$this->email->subject()设置,不能手写set_header('Subject', ...),否则绕过编码逻辑 - 如果主题含中文,CI 会自动用
mb_encode_mimeheader()处理,前提是charset正确且函数可用(PHP 需启用 mbstring 扩展)
怎么在 HTML 邮件里安全嵌入视图模板?
直接 $this->load->view('email/welcome', $data, true) 拿到 HTML 字符串没问题,但要注意三处细节:
立即学习“前端免费学习笔记(深入)”;
- 视图中避免使用绝对路径 CSS/JS——邮件客户端不执行脚本,也不加载外链资源;内联样式更可靠
- 务必检查视图输出是否含 BOM 头(尤其 Windows 下编辑保存的 .php 文件),会导致
Content-Transfer-Encoding错乱,整个邮件被当附件 - 若用
$this->email->set_alt_message()提供纯文本备选,内容需手动维护,CI 不会自动 strip 标签——别依赖“自动降级”
$this->email->send() 返回 false,但 print_debugger() 没输出?
这通常发生在调用 print_debugger() 前页面已输出内容(比如前面有 echo、空白行、或开启了输出缓冲但未 clean)。调试时最稳妥的方式是:
- 把
if (!$this->email->send()) { echo '<pre class="brush:php;toolbar:false;">' . htmlspecialchars($this->email->print_debugger()) . '</pre>'; }放在控制器末尾,确保无前置输出 - 检查
print_debugger()返回的是字符串,不是直接 echo——你得自己决定怎么展示它 - 如果返回空字符串,大概率是
send()根本没走到 SMTP 连接阶段,回头查protocol是否拼错、smtp_host是否可解析、smtp_crypto和smtp_port是否匹配(例如'tls'+465就无效)
真正容易被忽略的点是:HTML 邮件的换行符必须统一为 "\r\n",CI 的 newline 和 crlf 配置项缺一不可,否则 Gmail 等服务会截断部分内容——这个细节在调试信息里不会报错,但收件方看到的邮件永远少半截。



















