hou*_*ros 9 python encoding gmail-api
我正在使用Python API for Gmail.我正在查询一些消息并正确检索它们,但消息的正文看起来像完全无意义,即使它的MIME类型被text/plain称为或text/html.
我一直在搜索API文档,但他们一直说这是一个字符串,当它显然必须是一些编码...我认为它可能是base64编码,但尝试用Python解码它base64给了我TypeError: Incorrect padding,所以要么它不是base64或我的解码很糟糕.
我想提供一个很好的例子,但由于我正在处理敏感信息,我将不得不对它进行模糊处理......
{
"payload": {
"mimeType": "multipart/mixed",
"filename": "",
"headers": [
...
],
"body": {
"size": 0
},
"parts": [
{
"mimeType": "multipart/alternative",
"filename": "",
"headers": [
{
"name": "Content-Type",
"value": "multipart/alternative; boundary=001a1140b160adc309053bd7ec57"
}
],
"body": {
"size": 0
},
"parts": [
{
"partId": "0.0",
"mimeType": "text/plain",
"filename": "",
"headers": [
{
"name": "Content-Type",
"value": "text/plain; charset=UTF-8"
},
{
"name": "Content-Transfer-Encoding",
"value": "quoted-printable"
}
],
"body": {
"size": 4067,
"data": "LS0tLS0tLS0tLSBGb3J3YXJkZWQgbWVzc2FnZSAtLS0tLS0tLS0tDQpGcm9tOiBMaW5rZWRJbiA8am9iLWFwcHNAbGlua2VkaW4uY29tPg0KRGF0ZTogU2F0LCBTZXAgMywgMjAxNiBhdCA5OjMwIEFNDQpTdWJqZWN0OiBBcHBsaWNhdGlvbiBmb3IgU2VuaW9yIEJhY2tlbmQgRGV2ZWxvcG..."
}
Run Code Online (Sandbox Code Playgroud)
我正在谈论的领域是payload.parts[0].parts[0].body.data.我已经在随机点截断了它,所以我怀疑这样可以解码,但是你明白了......编码是什么?
另外,知道文档在哪里明确说出base64(除非它是MIME的标准编码?)也不会有什么坏处.
更新:所以最后还是有一些运气不好.我有5封这样的邮件,结果发现第一个邮件格式不正确,原因不明.继续其他的,我能够用答案中建议的方法解码所有这些.谢谢你们!
Dal*_*osa 13
这是base64.
截断的消息是:
---------- Forwarded message ----------
From: LinkedIn <job-apps@linkedin.com>
Date: Sat, Sep 3, 2016 at 9:30 AM
Subject: Application for Senior Backend Develop
Run Code Online (Sandbox Code Playgroud)
这是一些示例代码:
我必须从截断的消息中删除最后3个字符,因为我得到了与您相同的填充错误.你可能有一些垃圾你要解码的消息.
import base64
body = "LS0tLS0tLS0tLSBGb3J3YXJkZWQgbWVzc2FnZSAtLS0tLS0tLS0tDQpGcm9tOiBMaW5rZWRJbiA8am9iLWFwcHNAbGlua2VkaW4uY29tPg0KRGF0ZTogU2F0LCBTZXAgMywgMjAxNiBhdCA5OjMwIEFNDQpTdWJqZWN0OiBBcHBsaWNhdGlvbiBmb3IgU2VuaW9yIEJhY2tlbmQgRGV2ZWxv"
result = base64.b64decode(body)
print(result)
Run Code Online (Sandbox Code Playgroud)
这是一个用于获取和解码消息体的片段.解码部分取自gMail API文档:
message = service.users().messages().get(userId='me', id=msg_id, format='full').execute()
msg_str = base64.urlsafe_b64decode(message['payload']['body']['data'].encode('UTF8'))
mime_msg = email.message_from_string(msg_str)
print(msg_str)
Run Code Online (Sandbox Code Playgroud)
参考文档:https: //developers.google.com/gmail/api/v1/reference/users/messages/get#python
重要的区别是,它是网络安全的 base64编码(又名“base64url”)。文档对此不是很好,MessagePartBody 最好记录在这里: https: //developers.google.com/gmail/api/v1/reference/users/messages/attachments
它说类型是“字节”(显然不能按原样保存通过 JSON 传输),但我同意你的观点,它没有明确指定它的 base64url 编码,就像 API 中的其他“字节”字段一样。
至于填充问题,是因为你要截断吗?如果不是,请检查“len(data) % 4 == 0”,如果不是,则意味着 API 返回未填充的数据,这是意外的。