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

使用imap_fetchbody获取Gmail邮件正文返回异常乱码字符串如何解决

PHP imap扩展获取邮件正文乱码解决方案

你获取到的无意义长字符串是Base64编码后的邮件正文内容,PHP的imap扩展默认不会自动处理邮件的传输编码解码和字符集转换,同时你的原始代码还存在循环内硬编码邮件ID的逻辑错误,调整方法如下:

原始代码存在的问题

  • 循环内硬编码了固定邮件ID 415,没有使用遍历得到的$email_number变量,导致每次循环都读取同一封邮件
  • 没有对获取到的正文做传输编码解码
  • 没有适配不同邮件的字符集,容易出现二次乱码

调整后的可运行代码

$imap_conn = imap_open('{imap.gmail.com:993/imap/ssl}INBOX','user','password');
$inbox = imap_search($imap_conn, 'ALL');

if (! empty($inbox)) {
    foreach($inbox as $email_number) {
        // 获取当前邮件的结构信息
        $structure = imap_fetchstructure($imap_conn, $email_number);
        
        // 优先读取纯文本正文,对应part编号1.1;如果不存在则 fallback 读取HTML正文1.2
        $message = imap_fetchbody($imap_conn, $email_number, 1.1);
        if (trim($message) == '') {
            $message = imap_fetchbody($imap_conn, $email_number, 1.2);
        }
        
        // 根据邮件的编码类型做对应解码
        if ($structure->encoding == 3) {
            // 编码类型为Base64
            $message = base64_decode($message);
        } elseif ($structure->encoding == 4) {
            // 编码类型为Quoted-Printable
            $message = imap_qprint($message);
        }
        
        // 统一转换字符集为UTF-8,适配不同发件方的字符集设置
        $charset = isset($structure->parameters[0]->value) ? $structure->parameters[0]->value : 'UTF-8';
        $message = mb_convert_encoding($message, 'UTF-8', $charset);
        
        var_dump($message);
    }
}
// 操作结束后关闭imap连接
imap_close($imap_conn);

补充说明

如果需要处理带附件、结构更复杂的邮件,可以递归解析imap_fetchstructure返回的结构对象的parts属性,找到类型为文本的部分再做读取解码即可。

内容的提问来源于stack exchange,提问作者Marco Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 07:06:03