我正在使用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..."
}
我所谈论的领域是payload.parts[0].parts[0].body.data
。我已经在随机点截断了它,所以我怀疑这样可以解码,但是你明白了......那个编码是什么?
另外,知道文档在哪里明确说出base64(除非它是MIME的标准编码?),这不会有害。
更新:所以最后还是运气不好。我有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'