如何使用 Gmail API (python) 检索整个邮件正文

Posted

技术标签:

【中文标题】如何使用 Gmail API (python) 检索整个邮件正文【英文标题】:How to retrieve the whole message body using Gmail API (python) 【发布时间】:2018-11-10 19:27:51 【问题描述】:

我想使用 gmail api 提取邮件的整个邮件正文。现在我正在使用'sn-ps',但我需要整个文本。我搜索并发现它与有效载荷有关,但我不明白如何。有人可以给我看一个例子吗?另外,我正在通过 python 使用 Gmail api。

【问题讨论】:

【参考方案1】:

和noogui说的一样,但我发现sn-p不会返回整个身体

当 sn-p 超过 200~ 字符时,您将在 payload.body.data 下获得它 您可以使用 payload.body.data 找到整个身体

问题是你得到的是base64encoded,所以你需要解码它:)

下面的代码可以解决问题

import base64  
mail = service.users().messages().get(userId=user_id, id=id, format="full").execute()

def parse_msg(msg):
    if msg.get("payload").get("body").get("data"):
        return base64.urlsafe_b64decode(msg.get("payload").get("body").get("data").encode("ASCII")).decode("utf-8")
    return msg.get("snippet") 

【讨论】:

有没有办法获取计划正文。在文档中没有看到它? @emmdee 它没有写在文档中,你可以检查一些情况,看到短邮件在 sn-p 而长邮件在 payload.body.data 经过这么多来回,这对我有用。谢谢@OmerShacham【参考方案2】:

在有 Python sn-p 的文档中使用 Users.messages.get:

import base64
import email
from apiclient import errors

def GetMessage(service, user_id, msg_id):

  try:
    message = service.users().messages().get(userId=user_id, id=msg_id).execute()
    print 'Message snippet: %s' % message['snippet']
    return message
  except errors.HttpError, error:
    print 'An error occurred: %s' % error

def GetMimeMessage(service, user_id, msg_id):

  try:
    message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
    print 'Message snippet: %s' % message['snippet']
    msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
    mime_msg = email.message_from_string(msg_str)

    return mime_msg
  except errors.HttpError, error:
    print 'An error occurred: %s' % error

您尝试访问的是payload.body,或者如果您想更进一步,payload.body.data。

【讨论】:

【参考方案3】:

gmail api 文档提供了示例代码,展示了如何将完整的消息正文作为消息对象结构返回。但是,他们提供的代码不适用于 Python3。如果你想用 Python3 来做这个,你需要把他们的email.message_from_string() 改成email.message_from_bytes。不确定到底是哪个模块改变了这个导致这个问题发生,但下面的代码对我来说很好Python3.7.4

import base64
import email

message = gmail_conn.users().messages().get(userId=u_id, id=m_id, format='raw').execute()
msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
mime_msg = email.message_from_bytes(msg_str)

print(mime_msg)

【讨论】:

以上是关于如何使用 Gmail API (python) 检索整个邮件正文的主要内容,如果未能解决你的问题,请参考以下文章

使用 gmail python API 如何获取没有标签“已读”的最新电子邮件

如何使用 Python 下载每封 Gmail 电子邮件?

如何通过 gmail-api for python 发送 HTML 格式的电子邮件

Python:如何从 gmail API 获取电子邮件的主题

如何使用 Gmail API 阻止发件人?

如何设置凭据以从 GCE VM 命令行使用 Gmail API?