【问题标题】:Error querying messages by its rfc822msgid按其 rfc822msgid 查询消息时出错
【发布时间】:2016-01-11 05:07:11
【问题描述】:

我正在尝试通过消息 ID 获取消息。 Gmail API 没有传递 Message-ID 的 get() 方法,所以我必须先 list() 传递 q 参数如下所示:

q="rfc822msgid:%s" % message_id

正如所希望的那样,响应带来了一个包含一条消息的列表。然后我使用 get() 方法通过其 Google 样式 标识符检索消息。这就像一个魅力,除非 Message-ID 包含 + 字符:

message_id="a+b@c"

在这种情况下,Google Api 客户端请求此 URL:

url="https://www.googleapis.com/gmail/v1/users/me/messages?q=rfc822msgid%3Aa+b%40c&alt=json"

我认为客户端正在使用 safe="+" 执行 quote_plus() 以避免编码 + 字符。但这在注释的情况下会导致问题,因为服务器将 + 字符解释为空格,因此 Message-ID 不再有效:

message_id="a b@c"

我尝试将 + 字符切换为其引用表示(%2B),但是当客户端对 URL 进行编码时,Message-ID 变得非常糟糕,因为quote(quote())

message_id="a%252Bb%40c"

那么,有没有办法发送 + 字符避免服务器将其解码为空格字符?

提前致谢。

编辑:我正在研究此处评论的解决方案,但没有积极的结果。但是从几天前开始,我的原始代码开始工作。我没有改变任何一行,所以我认为谷歌已经修复了与此相关的问题。感谢 cmets。

【问题讨论】:

  • 您能否详细说明:我认为客户正在使用 safe="+" 执行 quote_plus()?你用的是什么客户端,不能查看代码/更新吗?
  • 我使用的是API Client Library for Python,这是谷歌推荐的。我使用client = build("gmail", "v1") 实例化Gmail API 客户端,然后使用client.users().list(),正如here 所述,搜索邮件。但是build() 方法会动态创建客户端,我无法找到 API 请求的完成位置/方式。
  • 我自己测试了一些字符串编码/引用,发现urllib.quote_plus("", safe="+")满足谷歌客户端实现,但不确定是不是这样;这只是一个猜测。
  • bug 自行消失了;我认为谷歌已经解决了一些问题。感谢您的帮助。
  • @prosody-GabVereableContext 从那时起(将近 4 年)我就没有处理过这段代码,但我认为这是一次性错误。没多久就解决了,所以我从来没有报告过。

标签: python gmail-api google-api-python-client


【解决方案1】:

URLEncoder.encode("+", "UTF-8");产生“%2B”

用查询参数替换“+”。即

URLEncoder.encode("rfc822msgid:", "UTF-8");

【讨论】:

  • bug 自行消失了;我认为谷歌已经解决了一些问题。感谢您的帮助。
  • @vermicida 您是否获得了错误报告确认号码或只是不得不信任?
猜你喜欢
  • 1970-01-01
  • 2021-06-27
  • 2017-01-10
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多