[Bug]: Gmail connector drops root and nested MIME message bodies

该问题出现在使用 RAGFlow 的 Go Gmail connector 同步邮件时,请求字段过窄(只请求了 payload(headers,parts(body(data),mimeType)) ),导致根级正文和嵌套 MIME 正文既未被请求也未被写入同步文档。优先排查 Gmail paylo

快速结论:该问题出现在使用 RAGFlow 的 Go Gmail connector 同步邮件时,请求字段过窄(只请求了 payload(headers,parts(body(data),mimeType))),导致根级正文和嵌套 MIME 正文既未被请求也未被写入同步文档。优先排查 Gmail payload 投影字段,而不是解码逻辑。

适用环境:RAGFlow 源码检出,Go 1.27.3,macOS arm64,CGO_ENABLED=0;Gmail connector 配置 batch_size=1,使用受控 HTTP transport(模拟 Google partial response),未接入真实邮箱,未使用凭据。上游基线为 main 94369fc289e61be2f7e43bd0c65862269207d9c4,验证分支为 fix/gmail-complete-mime-payload(4f0fcdd)。

最快修复方案:将 Gmail 请求的 payload 掩码从 payload(headers,parts(body(data),mimeType)) 改为完整的 payload(一行掩码变更),随后运行回归测试 TestGmailSyncRequestsCompleteMimePayload 验证。

注意事项:完整 payload 会请求更多字段,响应体积可能变大,但 Issue 未量化影响。现有验证基于受控 transport fixture,未在真实邮箱和完整服务端摄取流程中运行;另外验证针对的是当前 main,而非报告中固定的 94369fc,不过两者该掩码行一致。

问题场景

用户在 RAGFlow 中使用 Go 版 Gmail connector 执行邮件同步(OpenSync 与 NextBatch),配置 batch_size=1。当邮件是根级 text/plain,或 multipart/mixed → multipart/alternative → text/plain 这类嵌套 MIME 结构时,同步出的文档只保留邮件头(例如 subject: Body projection regression),正文丢失。Issue 使用合成邮箱和受控 HTTP transport 复现,未访问真实邮箱。

报错原文

[Bug]: Gmail connector drops root and nested MIME message bodies
mail body missing from synced document

原因分析

最可能的原因位于 HTTP 请求阶段:Gmail connector 请求 payload(headers,parts(body(data),mimeType)),该投影不包含根级 payload 的 body,也不包含任意深度的嵌套 parts。因此 Google API 根本不会返回这些正文数据,后续递归 MIME 读取器(gmailPayloadText 读取根级 text/plain,gmailPartText 递归读取嵌套 parts)无法恢复未被请求的字段。评论中的独立验证也确认解码逻辑本身可处理两种布局,问题在于请求投影而非解析器。Issue 还指出 PR #20226 修改的是 Python email chunker,与此 Go 端 HTTP 请求无关。

环境排查

  • 确认 RAGFlow 版本/提交:报告基线为 94369fc289e61be2f7e43bd0c65862269207d9c4;独立验证针对当前 upstream main,internal/syncer/connector/gmail.go:213 仍为窄投影。
  • 确认 Go 版本为 1.27.3,平台 macOS arm64,CGO_ENABLED=0。
  • 确认 Gmail connector 配置,尤其是 batch_size=1。
  • 检查 gmail.go 中的 payload 掩码是否为 payload(headers,parts(body(data),mimeType))。
  • 确认测试邮件布局:根级 text/plain 或嵌套 multipart 结构,正文含可识别文本(如 invoice amount 125)。

解决步骤

  1. 在 Gmail connector 的 HTTP 请求中将 payload 掩码改为完整 payload,并补充说明注释。
  2. 应用回归测试 TestGmailSyncRequestsCompleteMimePayload(位于 Zhi-Xiang-Guo:fix/gmail-complete-mime-payload 分支),覆盖根级正文与嵌套正文两种布局。
  3. 以 CGO_ENABLED=0 运行该回归测试及 connector 全套测试;Issue 记录修复后 684 个顶层测试和 193 个子测试通过。
  4. 若 PR #21811 已被关闭,可在维护者批准后重新打开或重新提交该修复;Issue 评论显示 #21811 已在验证过的提交上获批。

验证方法

用同样的邮件布局重新执行 OpenSync 与 NextBatch,检查同步出的 blob 是否同时包含主题行和正文文本;修复前回归用例报 mail body missing from synced document,修复后应通过,且 connector 测试套件全绿。注意 Issue 明确说明未完成真实 Google 邮箱集成和完整服务端摄取验证,线上邮箱场景仍建议自行抽查同步结果。

参考来源

infiniflow/ragflow #21810

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 33020

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注