使用Gmail API无法获取带样式的完整HTML邮件求助
如何通过Gmail API获取带样式的完整HTML邮件内容
问题出在两个核心点:Base64解码逻辑错误,以及硬编码取parts[1]无法适配所有邮件的MIME结构。以下是修复方案:
核心问题分析
- Base64解码错误:Gmail API返回的是URL安全的Base64编码(用
-替代+,_替代/),你代码里定义了sanitizedData但未实际使用,直接解码rawData会导致内容乱码或不完整。 - 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
相关产品推荐
相关产品推荐

