如何使用 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 如何获取没有标签“已读”的最新电子邮件
如何通过 gmail-api for python 发送 HTML 格式的电子邮件