网页表单西里尔文邮件正文显示乱码问题求助
解决PHP邮件正文UTF-8乱码问题
问题分析
邮件正文乱码的核心原因是未告知邮件客户端正文采用UTF-8编码,同时原代码存在一处语法错误需要修复。
1. 修复主题行语法错误
原代码中$email_subject行末尾多余的"\n";;会导致PHP语法错误,直接删除该部分:
$email_subject = '=?UTF-8?B?' . base64_encode("Съобщение от сайта: " . $subject) . '?=';
2. 添加邮件编码头信息
在邮件头中明确指定MIME版本、内容类型和编码方式,让邮件客户端正确解析UTF-8字符:
$headers = "From: $email_from \r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; $headers .= "Content-Transfer-Encoding: 8bit\r\n";
完整修改后的代码
<?php if(!isset($_POST['submit'])) { //This page should not be accessed directly. Need to submit the form. echo "Грешка; трябва да изпратите формата"; } $name = $_POST['name']; $visitor_email = $_POST['email']; $message = $_POST['message']; $subject = $_POST['subject']; $phone = $_POST['phone']; //Validate first if(empty($name)||empty($visitor_email)) { echo "Име и имейл са задължителни."; exit; } if(IsInjected($visitor_email)) { echo "Невалиден имейл."; exit; } $email_from = 'z3robot@...';//<== update the email address $email_subject = '=?UTF-8?B?' . base64_encode("Съобщение от сайта: " . $subject) . '?='; $email_body = "Name: $name. \n". "Phone: $phone. \n". "Subject: $subject. \n". "The message is: $message. \n". "Reply to: $visitor_email \n"; $to = "z3robot@...";//<== update the email address $headers = "From: $email_from \r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; $headers .= "Content-Transfer-Encoding: 8bit\r\n"; if(mail($to, $email_subject, $email_body, $headers)){ //if successful go to index page in 3 seconds. echo "Съобщението е изпратено успешно. Ще бъдете прехвърлени на главната страница след 3 секунди."; header("refresh:3; url=index.html"); }else{ //if not successful go to contacts page in 5 seconds. echo "Съобщението НЕ е изпратено успешно. Ще бъдете прехвърлени отново в страница Контакти след 5 секунди."; header("refresh:5; url=contact-us.html"); } //done. // Function to validate against any email injection attempts function IsInjected($str) { $injections = array('(\n+)', '(\r+)', '(\t+)', '(%0A+)', '(%0D+)', '(%08+)', '(%09+)' ); $inject = join('|', $injections); $inject = "/$inject/i"; if(preg_match($inject,$str)) { return true; }else{ return false; } } ?>
补充说明
如果需要对正文使用Base64编码(与主题处理方式一致),可调整如下:
- 对正文进行Base64编码:
$email_body = base64_encode($email_body); - 修改编码头:
$headers .= "Content-Transfer-Encoding: base64\r\n";
不过这种方式冗余,直接使用8bit编码配合UTF-8更简单直观。
内容的提问来源于stack exchange,提问作者Nikoalaaa
相关产品推荐
相关产品推荐

