用PHP发送邮件时,中文正文经常出现乱码,根本原因是邮件头没有正确声明字符集,或者程序内部编码与邮件声明编码不一致。只要显式设置UTF-8编码并规范发送流程,就能解决大部分乱码问题。

为什么PHP发邮件会乱码
PHP的mail函数在Linux下通常调用sendmail,它不会自动给邮件加上正确的字符集。如果你用默认方式发中文,收件方客户端不知道这是UTF-8文本,就会用本地编码去解析,于是变成乱码。常见错误写法如下:
<?php // 错误示例:没有指定编码,中文易乱码 $to = 'user@ipipp.com'; $subject = '测试邮件'; $body = '这是一封中文邮件正文'; mail($to, $subject, $body); ?>
使用mail函数手动加编码
在邮件头中加入Content-Type和charset=UTF-8,并把主题用base64编码,可避免乱码。注意换行要用rn。
<?php $to = 'user@ipipp.com'; $subject = 'PHP邮件编码测试'; // 主题转码,防止标题乱码 $encoded_subject = '=?UTF-8?B?' . base64_encode($subject) . '?='; $body = '这是一封中文邮件正文,已添加UTF-8编码。'; $headers = "MIME-Version: 1.0rn"; $headers .= "Content-type: text/plain; charset=UTF-8rn"; $headers .= "From: sender@ipipp.comrn"; mail($to, $encoded_subject, $body, $headers); ?>
用mb_send_mail更省事
mb_send_mail会自动处理编码,前提是用mb_language和mb_internal_encoding设置好。推荐用这种方式发中文邮件。
<?php
mb_language('uni');
mb_internal_encoding('UTF-8');
$to = 'user@ipipp.com';
$subject = 'mb_send_mail中文测试';
$body = '使用mb_send_mail发送,正文不会乱码。';
$headers = 'From: sender@ipipp.com';
mb_send_mail($to, $subject, $body, $headers);
?>
其他注意事项
- PHP文件本身保存为UTF-8无BOM格式,避免源文件编码带来的问题。
- 如果用SMTP类库如PHPMailer,也要调用设置方法如 $mail->CharSet = 'UTF-8';
- 测试时可用不同邮箱接收,确认网页端和客户端都显示正常。
按照上面方法给PHP邮件加上正确编码,中文乱码基本可以彻底解决。核心就是声明charset=UTF-8,并对主题做转码或使用多字节函数。
PHP邮件编码mb_send_mail修改时间:2026-07-30 21:39:20