如何使用Python中的 Gmail API 从 Gmail 读取电子邮件?
在本文中,我们将了解如何使用Python中的 Gmail API 从您的 Gmail 中读取电子邮件。 Gmail API 是一种 RESTful API,它允许用户与您的 Gmail 帐户交互并通过Python脚本使用其功能。
因此,让我们继续编写一个简单的Python脚本来阅读电子邮件。
要求
- Python (2.6 或更高版本)
- 启用 Gmail 的 Google 帐户
- 美丽的汤库
- Google API 客户端和 Google OAuth 库
安装
通过运行以下命令安装所需的库:
pip install –upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
运行它来安装 Beautiful Soup:
pip install beautifulsoup4
现在,您必须设置 Google Cloud 控制台才能与 Gmail API 交互。因此,请按照以下步骤操作:
- 登录 Google Cloud 控制台并创建新项目或继续现有项目。
- 转到API 和服务。
- 为所选项目启用Gmail API 。
- 现在,通过单击OAuth 同意屏幕(如果尚未配置)来配置同意屏幕。
- 输入应用程序名称并保存。
- 现在转到凭据。
- 单击创建凭据,然后转到OAuth 客户端 ID 。
- 选择应用程序类型为桌面应用程序。
- 输入应用程序名称,然后单击“创建”按钮。
- 将创建客户端 ID。将其下载到您的计算机并将其另存为credentials.json
请对您的客户 ID 和客户机密保密。
现在,一切都设置好了,我们可以开始编写代码了。所以,我们走吧。
代码
方法 :
文件“ token.pickle ”包含用户的访问令牌,因此,首先,我们将检查它是否存在。如果它不存在或无效,我们的程序将打开浏览器并要求访问用户的 Gmail 并保存以备下次使用。如果存在,我们将检查令牌是否需要刷新,如果需要则刷新。
现在,我们将使用访问令牌连接到Gmail API 。连接后,我们将请求消息列表。这将返回该 Gmail 帐户的最后 100 封电子邮件(默认值)的ID列表。我们可以通过传递一个可选参数“ maxResults ”来请求任意数量的电子邮件。
此请求的输出是一个字典,其中键“消息”的值是一个字典列表。每个字典都包含一个 Email 的ID和Thread ID 。
现在,我们将遍历所有这些字典并通过它们的ID请求电子邮件的内容。
这再次返回一个字典,其中键 ' payload ' 以字典的形式包含电子邮件的主要内容。
这本词典包含“标题”、“部分”、“文件名”等。因此,我们现在可以从这里轻松找到诸如发件人、主题等标题。关键的“部分”是一个字典列表,包含电子邮件正文的所有部分,例如文本、 HTML 、附件详细信息等。因此,我们可以从这里获取电子邮件的正文。它通常位于列表的第一个元素中。
正文采用Base 64编码。因此,我们必须将其转换为可读格式。解码后,得到的文本在' lxml '中。因此,我们将使用BeautifulSoup库对其进行解析并将其转换为文本格式。
最后,我们将打印Subject 、 Sender和Email 。
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 文件中,以制作来自特定发件人的电子邮件集合。