You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP邮件函数多语言编码异常:特殊字符显示乱码求助

解决邮件UTF-8乱码问题

问题根源

你碰到的乱码是UTF-8编码文本被当作ISO-8859-1(Latin-1)解析导致的,结合你的代码,主要有几个关键问题点需要调整:

具体修复步骤

1. 确保表单提交内容为UTF-8编码

先检查你的HTML表单页面:

  • 页面头部添加<meta charset="UTF-8">
  • 表单标签里设置accept-charset="UTF-8",示例:
<form method="post" action="你的脚本地址" accept-charset="UTF-8">

这一步能保证$_POST获取的内容本身就是UTF-8编码,从源头避免编码混乱。

2. 正确编码邮件主题

邮件主题不能直接传入UTF-8文本,得按RFC 2047标准编码,替换原代码中$subject的处理逻辑:

// 将主题编码为UTF-8的RFC 2047格式
$subject = '=?UTF-8?B?' . base64_encode($_POST['sendsubject']) . '?=';

3. 调整Mail_mime的编码设置

原代码里直接调用setHTMLBody,需要明确指定编码,让Mail_mime正确处理内容:

$mime = new Mail_mime($crlf);
// 设置HTML内容时指定UTF-8编码
$mime->setHTMLBody($body, '', 'UTF-8');
// 强制统一邮件各部分字符集
$mime->setParam('text_charset', 'UTF-8');
$mime->setParam('html_charset', 'UTF-8');
$mime->setParam('head_charset', 'UTF-8');

4. 移除不必要的utf8_encode调用

如果表单已经是UTF-8提交,$_POST['sendmessage']本身就是UTF-8编码,再用utf8_encode会导致双重编码,反而加重乱码。直接使用$body = $_POST['sendmessage'];即可。

5. 修正后的完整代码片段

$from = "xxxxx <xxxxxxxxxx@gmail.com>";
$to = $_POST['sendname']."<".$_POST['sendemail'].">";
// 编码邮件主题
$subject = '=?UTF-8?B?' . base64_encode($_POST['sendsubject']) . '?=';
$body = $_POST['sendmessage'];
$host = "pro.turbo-smtp.com";
$username = "xxxxxxxxxx";
$password = "xxxxxxxxxx";

// 基础请求头,先不设置Content-Type,交给Mail_mime处理
$headers = array (
    'From' => $from,
    'To' => $to,
    'Date' => date("r")
);

$smtp = Mail::factory('smtp',
    array (
        'host' => $host,
        'port' => 587,
        'auth' => true,
        'username' => $username,
        'password' => $password
    )
);

$crlf = "\r\n";
$mime = new Mail_mime($crlf);    
// 设置HTML内容并指定编码
$mime->setHTMLBody($body, '', 'UTF-8');
$mime->setParam('text_charset', 'UTF-8');
$mime->setParam('html_charset', 'UTF-8');
$mime->setParam('head_charset', 'UTF-8');

$bodyx = $mime->get();
// 让Mail_mime生成正确的请求头
$headers = $mime->headers($headers);
// 手动添加编码后的主题到请求头
$headers['Subject'] = $subject;

$mail = $smtp->send($to, $headers, $bodyx);

额外检查点

  • 确保你的PHP文件本身是以UTF-8无BOM格式保存的,避免文件编码引入额外问题。
  • 测试时可以直接赋值$body = "Meu nome é Rick";,排除表单提交的编码问题,验证邮件发送逻辑是否正确。

内容的提问来源于stack exchange,提问作者Karthik Malla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:02:40