PHP邮件发送至mail.bg/abv.bg出现乱码问题求助
解决mail.bg/abv.bg邮箱接收PHP邮件乱码问题
问题分析
你遇到的乱码(显示为РќРѕРІРѕ,实际应为Ново)核心原因是邮件编码声明与实际传输格式不匹配,加上headers格式错误:
- 邮件headers声明了
Content-Transfer-Encoding: base64,但正文未做base64编码,mail.bg/abv.bg这类严格遵循协议的邮箱会按base64规则解析明文UTF-8,导致乱码;Gmail容错性较强,自动识别了真实编码 - 代码中多余的
header('Content-Transfer-Encoding: base64');是网页响应头,和邮件发送逻辑无关 - 邮件headers存在错误的换行格式(
\n\r\n),可能导致邮箱服务器解析headers异常
解决步骤
1. 移除多余的HTTP响应头
删除与邮件发送无关的网页响应设置:
// 删除此行 header('Content-Transfer-Encoding: base64');
2. 修正邮件headers的换行格式
所有邮件headers的换行统一使用\r\n,确保每个header项后正确换行:
$headers = "From: $myemail\r\n"; $headers .= "Reply-To: $email_address\r\n"; // 添加\r\n保证换行 $headers .= 'Content-Type: text/plain; charset=utf-8' . "\r\n"; $headers .= 'Content-Transfer-Encoding: base64' . "\r\n"; // 修正错误换行格式
3. 对邮件正文进行base64编码
因为headers声明了base64传输编码,必须将正文转换为对应格式:
// 对邮件正文执行base64编码 $email_body = base64_encode("You have received a new message. ". " Here are the details:\n Name: $name \n Email: $email_address \n Message \n $message");
修改后的完整代码
<?php header('Content-Type: text/html; charset=utf-8'); $errors = ''; $myemail = 'example@mail.bg';//<-----Put Your email address here. if(empty($_POST['name']) || empty($_POST['email']) || empty($_POST['message'])) { $errors .= "\n Error: all fields are required"; } $name = $_POST['name']; $email_address = $_POST['email']; $message = $_POST['message']; $subject = $_POST['subject']; if (!preg_match( "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i", $email_address)) { $errors .= "\n Error: Invalid email address"; } if( empty($errors)) { $to = $myemail; $email_subject = "$subject, $name"; // 对邮件正文进行base64编码 $email_body = base64_encode("You have received a new message. ". " Here are the details:\n Name: $name \n Email: $email_address \n Message \n $message"); $headers = "From: $myemail\r\n"; $headers .= "Reply-To: $email_address\r\n"; $headers .= 'Content-Type: text/plain; charset=utf-8' . "\r\n"; $headers .= 'Content-Transfer-Encoding: base64' . "\r\n"; mail($to, '=?utf-8?B?'.base64_encode($email_subject).'?=', $email_body, $headers); //redirect to the 'thank you' page header('Location: contact-form-thank-you.html'); } ?>
补充方案
如果不想使用base64编码,也可以将Content-Transfer-Encoding改为quoted-printable,同时用quoted_printable_encode()处理正文,同样能解决UTF-8编码在严格协议邮箱的显示问题。
内容的提问来源于stack exchange,提问作者Nino
相关产品推荐
相关产品推荐

