![](/img/trans.png)
[英]how to download an email attachment from gmail in python for a particular subject and date
[英]Python: how to get the subject of an email from gmail API
使用 Gmail API,如何检索电子邮件的主题?
我在原始文件中看到它,但检索它很麻烦,我相信应该有一种方法可以直接通过 API 来完成。
messageraw= service.users().messages().get(userId="me", id=emails["id"], format="raw", metadataHeaders=None).execute()
这是因为这个同样的问题一个,但它已经接近甚至让我不能比发布提出了一个更好的答案。
正如在这个答案中提到的,主题在payload
的headers
"payload": {
"partId": string,
"mimeType": string,
"filename": string,
"headers": [
{
"name": string,
"value": string
}
],
但是,如果您使用format="raw
",则此方法不可用。 所以你需要使用format="full"
。
这是一个完整的代码:
# source = https://developers.google.com/gmail/api/quickstart/python?authuser=2
# connect to gmail api
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
def main():
# create the credential the first time and save it in token.pickle
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server()
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
#create the service
service = build('gmail', 'v1', credentials=creds)
#*************************************
# ressources for *get* email
# https://developers.google.com/resources/api-libraries/documentation/gmail/v1/python/latest/gmail_v1.users.messages.html#get
# code example for decode https://developers.google.com/gmail/api/v1/reference/users/messages/get
#*************************************
messageheader= service.users().messages().get(userId="me", id=emails["id"], format="full", metadataHeaders=None).execute()
# print(messageheader)
headers=messageheader["payload"]["headers"]
subject= [i['value'] for i in headers if i["name"]=="Subject"]
print(subject)
if __name__ == '__main__':
main()
由于这是我遇到的问题,我只想分享我发现的解决我自己问题的方法。
我习惯于使用email
模块,该模块为您提供了一个与消息交互的简洁界面。 为了解析 gmail api 给你的消息,以下对我有用:
import email
import base64
messageraw = service.users().messages().get(
userId="me",
id=emails["id"],
format="raw",
metadataHeaders=None
).execute()
email_message = email.message_from_bytes(
base64.urlsafe_b64decode(messageraw['raw'])
)
您最终会得到一个email.Message
对象,并且可以访问像email_message['from']
这样的元数据。
使用此代码读取邮件的所有内容
resultado = service.users().messages().list(userId= 'me',q=q_str,labelIds= ['INBOX']).execute()
mensajes = resultado.get('messages', [])
print ("Mensaje:")
for mensaje in mensajes[:1]:
leer = service.users().messages().get(userId='me', id=mensaje['id']).execute()
payload = leer.get("payload")
header = payload.get("headers")
for x in header:
if x['name'] == 'subject':
sub = x['value'] #subject
print(sub)
print(leer['snippet']) #body
q=q_str
,这是过滤器。 查看 API 文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.