【发布时间】: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