如何修改PHP邮件发送代码解决UTF-8字符编码问题?
邮件UTF-8特殊字符乱码问题排查与解决
乱码问题大概率出在PHP的邮件头设置环节,和HTML表单的UTF-8编码无关,核心原因是邮件发送时未正确声明字符编码规则,导致邮件客户端无法识别UTF-8格式的特殊字符(öüóőúéá等)。
具体原因
- 未指定邮件Content-Type编码:PHP默认的
mail()函数发送邮件时,会使用系统默认字符集(通常是ISO-8859-1),和表单提交的UTF-8编码不匹配,直接导致特殊字符解析错误。 - 缺少传输编码声明:UTF-8字符需要对应的传输编码(如
quoted-printable或base64)来保证传输过程中不被破坏,缺失该声明会让客户端无法正确解码。 - 服务器默认字符集干扰(少见):如果服务器的PHP全局字符集不是UTF-8,可能在接收表单数据时自动转码,但这种情况只要表单明确设置
accept-charset="UTF-8"就可以避免。
解决方法
修改PHP邮件发送代码,补充正确的邮件头信息,明确指定UTF-8编码:
// 接收表单提交的内容 $user_content = $_POST['form_content']; $target_email = '指定邮箱@yourserver.com'; // 邮件主题需转码,避免主题中的特殊字符乱码 $subject = '=?UTF-8?B?' . base64_encode('用户表单提交内容') . '?='; // 构建完整的邮件头 $headers = "MIME-Version: 1.0\r\n"; // 纯文本邮件用text/plain,HTML邮件替换为text/html $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; $headers .= "Content-Transfer-Encoding: quoted-printable\r\n"; $headers .= "From: 网站表单 <noreply@yourdomain.com>\r\n"; // 发送邮件 mail($target_email, $subject, $user_content, $headers);
关键说明
- 邮件主题必须用
=?UTF-8?B?...?=格式进行base64编码,否则主题中的特殊字符同样会乱码。 - 如果发送的是HTML格式邮件,将
Content-Type改为text/html; charset=UTF-8即可。 - 确保表单标签添加
accept-charset="UTF-8",进一步保证提交数据的编码一致性。
内容的提问来源于stack exchange,提问作者Bálint Forgács
相关产品推荐
相关产品推荐

