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

时间:2016-09-07 14:56:20

标签: python encoding gmail-api

我正在使用Python API for Gmail。我正在查询一些消息并正确检索它们,但消息正文看起来完全是胡说八道,即使它的MIME类型被称为text/plaintext/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..."
      }

我所谈论的领域是payload.parts[0].parts[0].body.data。我已经在随机点截断了它,所以我怀疑这样可以解码,但是你明白了......那个编码是什么?

另外,知道文档在哪里明确说出base64(除非它是MIME的标准编码?),这不会有害。

更新:所以最后还是运气不好。我有5封这样的邮件,结果发现第一个邮件格式不正确,原因不明。继续其他的,我能够用答案中建议的方法解码所有这些。谢谢大家!

5 个答案:

答案 0 :(得分:9)

这是base64。

您的截断消息是:

---------- Forwarded message ----------
From: LinkedIn <job-apps@linkedin.com>
Date: Sat, Sep 3, 2016 at 9:30 AM
Subject: Application for Senior Backend Develop

以下是一些示例代码:

我必须从截断的邮件中删除最后3个字符,因为我得到了与您相同的填充错误。你可能想要解码的消息可能有些垃圾。

import base64

body = "LS0tLS0tLS0tLSBGb3J3YXJkZWQgbWVzc2FnZSAtLS0tLS0tLS0tDQpGcm9tOiBMaW5rZWRJbiA8am9iLWFwcHNAbGlua2VkaW4uY29tPg0KRGF0ZTogU2F0LCBTZXAgMywgMjAxNiBhdCA5OjMwIEFNDQpTdWJqZWN0OiBBcHBsaWNhdGlvbiBmb3IgU2VuaW9yIEJhY2tlbmQgRGV2ZWxv"

result = base64.b64decode(body)

print(result)

更新

这是一个用于获取和解码邮件正文的代码段。解码部分取自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)

参考文档: https://developers.google.com/gmail/api/v1/reference/users/messages/get#python

答案 1 :(得分:2)

这是base64。您可以使用base64.decodestring来读取它。 您所附信息的部分是:'----------转发的消息---------- \ r \ n来自:LinkedIn&lt; job-apps@linkedin.com> \ r \ n日期:2016年9月3日星期六上午9:30 \ r \ n主题:申请高级后端开发'

填充错误的错误意味着您正在解码不正确的字符数。您可能正在尝试解码截断的消息。

答案 2 :(得分:2)

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

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

至于填充问题,是因为你要截断吗?如果没有,检查“len(data)%4 == 0”,如果没有,则表示API正在返回未填充的数据,这将是意外的。

答案 3 :(得分:1)

以下内容对我有用:

base64.urlsafe_b64decode(body).decode("utf-8")

答案 4 :(得分:0)

>>> "LS0tLS0tLS0tLSBGb3J3YXJkZWQgbWVzc2FnZSAtLS0tLS0tLS0tDQpGcm9tOiBMaW5rZWRJbiA8am9iLWFwcHNAbGlua2VkaW4uY29tPg0KRGF0ZTogU2F0LCBTZXAgMywgMjAxNiBhdCA5OjMwIEFNDQpTdWJqZWN0OiBBcHBsaWNhdGlvbiBmb3IgU2VuaW9yIEJhY2tlbmQgRGV2ZWxvcG==".decode('base64')
'---------- Forwarded message ----------\r\nFrom: LinkedIn <job-apps@linkedin.com>\r\nDate: Sat, Sep 3, 2016 at 9:30 AM\r\nSubject: Application for Senior Backend Develop'