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

使用Gmail API无法获取带样式的完整HTML邮件求助

如何通过Gmail API获取带样式的完整HTML邮件内容

问题出在两个核心点:Base64解码逻辑错误,以及硬编码取parts[1]无法适配所有邮件的MIME结构。以下是修复方案:

核心问题分析

  1. Base64解码错误:Gmail API返回的是URL安全的Base64编码(用-替代+,_替代/),你代码里定义了sanitizedData但未实际使用,直接解码rawData会导致内容乱码或不完整。
  2. MIME结构适配问题:邮件的MIME结构并非固定的扁平格式,部分邮件会嵌套多层multipart类型,或HTML部分的索引不固定,硬编码parts[1]会遗漏或错误获取内容。

修复后的完整代码

$service = new Google_Service_Gmail($client);
$client->setAccessToken($_SESSION['access_token']);

// 获取邮件列表
$list = $service->users_messages->listUsersMessages('me', ['maxResults' => 10]);
$messageList = $list->getMessages();
if (empty($messageList)) {
    echo "No messages found.";
    exit;
}

// 获取单封邮件详情
$messageId = $messageList[0]->getId();
$optParamsGet = ['format' => 'full'];
$message = $service->users_messages->get('me', $messageId, $optParamsGet);
$payload = $message->getPayload();

// 递归查找HTML内容的函数
function findHtmlPart($payload) {
    // 直接判断当前payload是否为HTML类型
    if ($payload->getMimeType() === 'text/html') {
        return $payload->getBody();
    }
    // 遍历子parts递归查找
    $parts = $payload->getParts();
    if (!empty($parts)) {
        foreach ($parts as $part) {
            $htmlPart = findHtmlPart($part);
            if ($htmlPart) {
                return $htmlPart;
            }
        }
    }
    return null;
}

// 获取HTML部分并解码
$htmlBody = findHtmlPart($payload);
if ($htmlBody) {
    $rawData = $htmlBody->getData();
    // 处理URL安全的Base64编码
    $sanitizedData = strtr($rawData, '-_', '+/');
    $decodedHtml = base64_decode($sanitizedData);
    var_dump($decodedHtml);
} else {
    echo "This message has no HTML content.";
}

代码说明

  • 新增findHtmlPart递归函数:遍历邮件所有MIME层级,确保找到正确的text/html类型内容,适配嵌套或复杂结构的邮件。
  • 修复解码逻辑:使用处理后的sanitizedData进行Base64解码,保证样式、图片链接等HTML内容完整还原。
  • 增加空值判断:避免因邮件列表为空或无HTML内容导致的运行错误。

内容的提问来源于stack exchange,提问作者Mukesh Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:57:20