Gmail邮件正文的编码是什么?怎么解码呢?

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)

UPDATE

这是一个用于获取和解码消息体的片段.解码部分取自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


Eri*_*c D 7

重要的区别是,它是网络安全的 base64编码(又名“base64url”)。文档对此不是很好,MessagePartBody 最好记录在这里: https: //developers.google.com/gmail/api/v1/reference/users/messages/attachments

它说类型是“字节”(显然不能按原样保存通过 JSON 传输),但我同意你的观点,它没有明确指定它的 base64url 编码,就像 API 中的其他“字节”字段一样。

至于填充问题,是因为你要截断吗?如果不是,请检查“len(data) % 4 == 0”,如果不是,则意味着 API 返回未填充的数据,这是意外的。