📜  如何使用Python中的 Gmail API 从 Gmail 读取电子邮件?

📅  最后修改于: 2022-05-13 01:55:14.880000             🧑  作者: Mango

如何使用Python中的 Gmail API 从 Gmail 读取电子邮件?

在本文中,我们将了解如何使用Python中的 Gmail API 从您的 Gmail 中读取电子邮件。 Gmail API 是一种 RESTful API,它允许用户与您的 Gmail 帐户交互并通过Python脚本使用其功能。

因此,让我们继续编写一个简单的Python脚本来阅读电子邮件。

要求

  • Python (2.6 或更高版本)
  • 启用 Gmail 的 Google 帐户
  • 美丽的汤库
  • Google API 客户端和 Google OAuth 库

安装

通过运行以下命令安装所需的库:

运行它来安装 Beautiful Soup:

现在,您必须设置 Google Cloud 控制台才能与 Gmail API 交互。因此,请按照以下步骤操作:

  • 登录 Google Cloud 控制台并创建新项目或继续现有项目。

创建新项目

  • 转到API 和服务

转到 API 和服务

  • 为所选项目启用Gmail API

转到启用 API 和服务

启用 Gmail API

  • 现在,通过单击OAuth 同意屏幕(如果尚未配置)来配置同意屏幕。

配置同意屏幕

  • 输入应用程序名称并保存。

输入应用名称

  • 现在转到凭据

转到凭据

  • 单击创建凭据,然后转到OAuth 客户端 ID

创建 OAuth 客户端 ID

  • 选择应用程序类型为桌面应用程序。
  • 输入应用程序名称,然后单击“创建”按钮。
  • 将创建客户端 ID。将其下载到您的计算机并将其另存为credentials.json

请对您的客户 ID 和客户机密保密。

现在,一切都设置好了,我们可以开始编写代码了。所以,我们走吧。

代码

方法 :

文件“ token.pickle ”包含用户的访问令牌,因此,首先,我们将检查它是否存在。如果它不存在或无效,我们的程序将打开浏览器并要求访问用户的 Gmail 并保存以备下次使用。如果存在,我们将检查令牌是否需要刷新,如果需要则刷新。

现在,我们将使用访问令牌连接到Gmail API 。连接后,我们将请求消息列表。这将返回该 Gmail 帐户的最后 100 封电子邮件(默认值)的ID列表。我们可以通过传递一个可选参数“ maxResults ”来请求任意数量的电子邮件。

此请求的输出是一个字典,其中键“消息”的值是一个字典列表。每个字典都包含一个 Email 的IDThread ID

现在,我们将遍历所有这些字典并通过它们的ID请求电子邮件的内容。

这再次返回一个字典,其中键 ' payload ' 以字典的形式包含电子邮件的主要内容。

这本词典包含“标题”、“部分”、“文件名”等。因此,我们现在可以从这里轻松找到诸如发件人主题等标题。关键的“部分”是一个字典列表,包含电子邮件正文的所有部分,例如文本HTML 、附件详细信息等。因此,我们可以从这里获取电子邮件的正文。它通常位于列表的第一个元素中。

正文采用Base 64编码。因此,我们必须将其转换为可读格式。解码后,得到的文本在' lxml '中。因此,我们将使用BeautifulSoup库对其进行解析并将其转换为文本格式。

最后,我们将打印SubjectSenderEmail

Python3
# import the required libraries
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import pickle
import os.path
import base64
import email
from bs4 import BeautifulSoup
  
# Define the SCOPES. If modifying it, delete the token.pickle file.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
  
def getEmails():
    # Variable creds will store the user access token.
    # If no valid token found, we will create one.
    creds = None
  
    # The file token.pickle contains the user access token.
    # Check if it exists
    if os.path.exists('token.pickle'):
  
        # Read the token from the file and store it in the variable creds
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
  
    # If credentials are not available or are invalid, ask the user to log in.
    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(port=0)
  
        # Save the access token in token.pickle file for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
  
    # Connect to the Gmail API
    service = build('gmail', 'v1', credentials=creds)
  
    # request a list of all the messages
    result = service.users().messages().list(userId='me').execute()
  
    # We can also pass maxResults to get any number of emails. Like this:
    # result = service.users().messages().list(maxResults=200, userId='me').execute()
    messages = result.get('messages')
  
    # messages is a list of dictionaries where each dictionary contains a message id.
  
    # iterate through all the messages
    for msg in messages:
        # Get the message from its id
        txt = service.users().messages().get(userId='me', id=msg['id']).execute()
  
        # Use try-except to avoid any Errors
        try:
            # Get value of 'payload' from dictionary 'txt'
            payload = txt['payload']
            headers = payload['headers']
  
            # Look for Subject and Sender Email in the headers
            for d in headers:
                if d['name'] == 'Subject':
                    subject = d['value']
                if d['name'] == 'From':
                    sender = d['value']
  
            # The Body of the message is in Encrypted format. So, we have to decode it.
            # Get the data and decode it with base 64 decoder.
            parts = payload.get('parts')[0]
            data = parts['body']['data']
            data = data.replace("-","+").replace("_","/")
            decoded_data = base64.b64decode(data)
  
            # Now, the data obtained is in lxml. So, we will parse 
            # it with BeautifulSoup library
            soup = BeautifulSoup(decoded_data , "lxml")
            body = soup.body()
  
            # Printing the subject, sender's email and message
            print("Subject: ", subject)
            print("From: ", sender)
            print("Message: ", body)
            print('\n')
        except:
            pass
  
  
getEmails()


现在,运行脚本

python3 email_reader.py

这将尝试在您的默认浏览器中打开一个新窗口。如果失败,请从控制台复制 URL 并在浏览器中手动打开它。

现在,如果您尚未登录,请登录您的 Google 帐户。如果有多个帐户,系统会要求您选择其中一个。然后,单击“允许”按钮。

您的应用程序请求许可

身份验证完成后,您的浏览器将显示一条消息:“身份验证流程已完成。您可以关闭此窗口”。

该脚本将开始在控制台中打印电子邮件数据。

您还可以扩展它并将电子邮件保存在单独的文本或 csv 文件中,以制作来自特定发件人的电子邮件集合。