我有一个 Python 脚本,它与 Gmail API 交互,并搜索来自特定电子邮件地址、具有特定描述的未读邮件。但我想要它,所以当它读取邮件时,它会删除 UNREAD 标签,这样当我再次运行脚本时它就不会检测到它。
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():
"""Shows basic usage of the Gmail API.
Lists the user's Gmail labels.
"""
email_address1 = "[email protected]"
email_address2 = "[email protected]"
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user 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 credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('gmail', 'v1', credentials=creds)
# Call the Gmail API
results = service.users().labels().list(userId='me').execute()
labels = results.get('labels', [])
#Get Messages
results = service.users().messages().list(userId='me', labelIds=['INBOX'], q=f'from:{email_address1} OR from:{email_address2} is:unread').execute()
messages = results.get('messages', [])
#Messages Filter
message_count = 100
for message in messages[:message_count]:
msg = service.users().messages().get(userId='me', id=message['id']).execute()
email = (msg['snippet'])
if "que recibiste Monto $" in email:
print(f'{email}\n')
service.users().messages().modify(userId='me', id=message['id'], body={'removeLabelIds': ['UNREAD']}).execute()
if __name__ == '__main__':
main()
该脚本工作得很好,直到它达到我删除 UNREAD 标签的尝试,所以它不会就再也检测不到了这里
service.users().messages().modify(userId='me', id=message['id'], body={'removeLabelIds': ['UNREAD']}).execute()
我知道这是可以做到的,因为在Gmail API文档的标签部分它说可以手动更改UNREAD标签。
所以如果有人可以帮助我,我将不胜感激。
你代码的思路是正确的,但可能
service.users().messages().modify()
调用本身有些小问题。请尝试如下修改:
service.users().messages().modify(userId='me', id=message['id'],
body={'removeLabelIds': ['UNREAD'], 'addLabelIds': []}).execute()
主要变化在于我们在
body
中加入了
'addLabelIds': []
。 这是因为
modify()
方法需要同时指定要添加和删除的标签。即使你不打算添加任何标签,也需要提供一个空列表以表示这一点。
如果修改后仍然无法正常工作,请检查以下几点:
-
权限范围
: 确保你的
SCOPES
包含修改邮件标签的权限。你可以使用https://www.googleapis.com/auth/gmail.modify
这个范围。 -
错误信息
: 执行
modify()
方法后,检查是否有任何错误信息返回。错误信息可能包含更具体的原因。 -
邮件数量
: 确认
message_count
的值是否过小,导致没有足够的邮件被处理。
通过以上步骤,你应该能够成功删除已读邮件的 "UNREAD" 标签,并在下次运行脚本时避免重复读取。
标签:python,api,gmail-api From: 75341704