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

Gmail API获取邮件时返回空邮件体问题求助

解决Gmail API获取邮件体为空的问题

你遗漏了以下几个关键排查点和修复方向:

1. 未处理多部分(Multipart)邮件结构

大部分邮件采用多部分MIME格式,此时Payload.Body会是空值,实际邮件体存储在Payload.Parts数组中。你的代码只直接读取Payload.Body,完全没处理这种场景,这是核心问题。

需要递归遍历Payload.Parts,找到MimeType为text/plain或text/html的部分,从中提取邮件体。

2. 验证OAuth2权限范围

确保你的应用请求的OAuth2权限包含https://www.googleapis.com/auth/gmail.readonly(只读权限)或更高权限(如gmail.modify)。权限不足时,API可能返回不完整的邮件数据。

3. 尝试改用raw格式获取邮件

如果full格式解析存在异常,可以尝试调用API时指定Format("raw"),获取完整的原始邮件数据后,自行使用MIME解析库处理,这种方式能避免API解析带来的结构问题。

修复后的代码示例

添加递归获取邮件体的辅助函数:

func getMessageBody(payload *gmail.MessagePart) string {
    // 先检查当前part是否有直接的body数据
    if payload.Body != nil && payload.Body.Data != "" {
        data, err := b64.RawURLEncoding.DecodeString(payload.Body.Data)
        if err != nil {
            log.Println("base64解码错误:", err)
            return ""
        }
        return string(data)
    }
    // 递归处理多部分邮件
    if payload.Parts != nil {
        for _, part := range payload.Parts {
            // 优先提取纯文本内容,如需HTML可替换为"text/html"
            if part.MimeType == "text/plain" {
                return getMessageBody(part)
            }
        }
    }
    return ""
}

修改原函数中获取邮件体的逻辑:

func GetEmail(srv *gmail.Service, historyId uint64) (string, string) {
    hist := getHistory(srv, historyId)

    for _, h := range hist.History {
        for _, m := range h.MessagesAdded {
            id := m.Message.Id
            mailContent, err := srv.Users.Messages.Get("me", id).Format("full").Do()
            if err != nil {
                log.Println("获取邮件内容错误: ", err)
                continue // 出错时跳过当前邮件,继续处理下一个
            }

            if mailContent != nil && mailContent.Payload != nil {
                body := getMessageBody(mailContent.Payload)
                if len(body) > 0 {
                    subject := getSubject(mailContent)
                    log.Println("邮件主题 ", subject)
                    return body, subject
                }
            }
        }
    }

    return "无待处理邮件或出现异常 - GetEmail函数", ""
}

内容的提问来源于stack exchange,提问作者Alex Barros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:10:27