【问题标题】:Python: how to get the subject of an email from gmail APIPython:如何从 gmail API 获取电子邮件的主题
【发布时间】:2019-08-04 06:28:59
【问题描述】:

使用 Gmail API,我如何检索电子邮件的主题?

我在原始文件中看到它,但检索它很麻烦,而且我确信应该有一种方法可以直接通过 API 进行。

messageraw= service.users().messages().get(userId="me", id=emails["id"], format="raw", metadataHeaders=None).execute()

这与one 的问题相同,但它已经很接近了,所以我无法发布比提议的答案更好的答案。

【问题讨论】:

  • user.messages.get() 将返回所有内容,包括标题
  • payload.headers[] 此消息部分的标头列表。对于表示整个消息有效负载的顶级消息部分,它将包含标准 RFC 2822 电子邮件标头,例如 To、From 和 Subject。 [更多信息] (developers.google.com/gmail/api/v1/reference/users/messages)

标签: python python-3.x email gmail-api


【解决方案1】:

正如answer 中提到的,主题在来自payloadheaders

 "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()

【讨论】:

    【解决方案2】:

    因为这是我遇到的问题,所以我只想分享我发现的解决我自己问题的方法。

    我习惯于使用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'] 这样的元数据。

    【讨论】:

    • 谢谢。我觉得很奇怪,这不在官方文档中
    【解决方案3】:

    用这段代码读取邮件的所有内容

    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 文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 2021-04-19
      • 2021-04-27
      • 1970-01-01
      • 2019-07-12
      • 2020-02-13
      • 2018-11-03
      • 2021-08-14
      相关资源
      最近更新 更多