PHP联系表单发送邮件乱码问题:无法支持UTF-8编码
解决PHP联系表单捷克语邮件乱码问题
我完全懂你现在的困扰——明明页面和表单都设置了UTF-8,发送的捷克语邮件还是乱码,这确实让人摸不着头脑。问题的核心其实出在邮件本身的编码头没有配置,咱们来一步步调整代码解决这个问题:
关键修改点:完善邮件头部(Headers)
原代码里的$headers只设置了发件人邮箱,没有告诉邮件客户端要用UTF-8编码解析内容。你需要添加MIME声明和编码指定,修改后的headers应该是这样:
// 构建完整的邮件头部,指定UTF-8编码 $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8" . "\r\n"; // 规范发件人格式,把名称和邮箱结合,避免名称乱码 $headers .= "Od: " . mb_encode_mimeheader($name, "UTF-8") . " <" . $mailFrom . ">" . "\r\n";
为什么要这么改?
MIME-Version: 1.0:告诉邮件客户端这是符合MIME标准的邮件,支持编码声明Content-Type: text/plain; charset=UTF-8:明确指定邮件内容是纯文本,并且用UTF-8编码解析,这是解决乱码的核心mb_encode_mimeheader($name, "UTF-8"):专门处理发件人名称的编码,避免名称里的特殊字符(比如捷克语的重音符号)乱码
完整修改后的代码
把你的代码替换成下面的版本,同时调整了校验逻辑的顺序(原代码里发送邮件的逻辑在校验之前,会导致即使表单为空也会发送空邮件):
<?php if (isset($_POST['submit'])) { // 获取表单数据,确保编码为UTF-8 $name = $_POST['name']; $subject = $_POST['subject']; $mailFrom = $_POST['email']; $message = $_POST['message']; // 先做表单校验,避免无效发送 if (empty($name) || empty($subject) || empty($mailFrom) || empty($message)) { header("Location: ../page-contact-form.php?form=empty"); exit(); } if (!filter_var($mailFrom, FILTER_VALIDATE_EMAIL)) { header("Location: ../page-contact-form.php?form=email"); exit(); } // 配置邮件参数 $mailTo = "info@mnbl.eu"; // 编码邮件主题,避免乱码 $encodedSubject = mb_encode_mimeheader($subject, "UTF-8"); $txt = "Dostal jste e-mail od " . $name . ".\n\n" . $message; // 构建带编码的邮件头部 $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8" . "\r\n"; $headers .= "Od: " . mb_encode_mimeheader($name, "UTF-8") . " <" . $mailFrom . ">" . "\r\n"; // 发送邮件 mail($mailTo, $encodedSubject, $txt, $headers); header("Location: ../page-contact-form.php?mailsend"); exit(); } ?>
额外注意事项
- 强制服务器编码:如果修改后还是乱码,可以在代码开头添加
mb_internal_encoding("UTF-8");,强制PHP使用UTF-8处理字符串 - 检查邮件源码:发送测试邮件后,查看邮件的原始源码,确认
Content-Type字段是否显示charset=UTF-8,如果没有说明头部设置没生效 - 避免双重编码:不要对表单数据进行多余的编码转换(比如
utf8_encode),否则会导致双重编码乱码
内容的提问来源于stack exchange,提问作者David Krapka
相关产品推荐
相关产品推荐

