首页 > 编程问答 >一个 API,用于读取带有特定描述的未读邮件,但在读取时删除标签 UNREAD

一个 API,用于读取带有特定描述的未读邮件,但在读取时删除标签 UNREAD

时间:2024-08-01 16:03:36浏览次数:15  
标签:python api gmail-api

我有一个 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() 方法需要同时指定要添加和删除的标签。即使你不打算添加任何标签,也需要提供一个空列表以表示这一点。

如果修改后仍然无法正常工作,请检查以下几点:

  1. 权限范围 : 确保你的 SCOPES 包含修改邮件标签的权限。你可以使用 https://www.googleapis.com/auth/gmail.modify 这个范围。
  2. 错误信息 : 执行 modify() 方法后,检查是否有任何错误信息返回。错误信息可能包含更具体的原因。
  3. 邮件数量 : 确认 message_count 的值是否过小,导致没有足够的邮件被处理。

通过以上步骤,你应该能够成功删除已读邮件的 "UNREAD" 标签,并在下次运行脚本时避免重复读取。

标签:python,api,gmail-api
From: 75341704

相关文章

  • 为什么Python库中还没有Gauss-Jordan消去函数?
    Gaussian-Jordan消除法是一种常用且方便的技术。在矩阵计算中,该方法得到广泛应用。但是,Python库中没有此方法的内置函数。设计这样的功能并不困难。开发人员似乎忽略了这个功能。这可能是什么原因?希望开发者能够重视这一点,并开发与该方法相关的功能。虽然高斯-约旦消元......
  • Python爬虫 - js逆向之扣出某平台的_signature加密字段
    前言好久没有做逆向案例分析了,最近都在看同行朋友写好的案例,感觉学到很多,算是取长补短了不多bb,机缘巧合下,拿到个目标网站分析首先抓个包,就看到请求参数里带着这几个参数主要就是_signature了,其他的参数都不重要得想必你一看就知道啥意思了。行,开始分析_signature......
  • 如何调试 NCO/Meteocean-API 代码以获得大气数据?
    我目前正在尝试利用Python中的meteocean-api来下载和使用NORA3数据。这在后台使用nco包来处理文件。我下载了它及其所有依赖项(包括nco),只需使用:condainstall-cconda-forgemetocean-api这给我的计算机带来了很多麻烦,包括需要将sqlite3DLL重新包含回正确的位......
  • python 音频处理(1)——重采样、音高提取
    采集数据->采样率调整使用torchaudio进行重采样(cpu版)首先导入相关包,既然使用torch作为我们的选项,安装torch环境我就不必多说了,如果你不想用torch可以使用后文提到的另一个库1importtorch2importtorchaudio3fromtorchaudio.transformsimportResample4fromtime......
  • 用于从连接到 LAN 交换机的四个 Arduino 扩展板读取/保存数据的 Python 代码
    我有四个Arduino扩展板连接到LAN交换机。每个人都会发出一条“HelloJane”消息。LAN交换机已连接到我的PC。我需要将每个Arduino的数据/消息保存在PC上的单独文件夹中。请帮助使用Python脚本/代码。我能够看到来自所有四个Arduino的消息,但无法将它们保存到文......
  • 使用 Python 生产者和消费者在 Kubernetes minikube 上设置 Kafka Kraft
    我正在尝试从kubernetes集群外部连接到kubernetesminikubekafkapod。服务器启动没有任何问题,但我无法设法将本地kafka生产者/消费者连接到外部kafkapod。在集群内的kafka服务器映像上,我将bootstrap-server设置为:bin/kafka-topics.sh--create--bootst......
  • python llama_index.indices.list.retrievers 导入错误
    fromllama_indeximportGPTListIndexfromllama_index.indices.list.retrieversimportListIndexLLMRetrieverdocuments=SimpleDirectoryReader('./data').load_data()index=GPTListIndex.from_documents(documents,service_context=service_context)r......
  • 如何使用 python 和 bs4 修复抓取 web 表输出 csv
    请帮帮我,,我想在“td”、“Barcode”和“namaproduk”中获取2个数据,但我得到的数据非常糟糕。我应该修复什么?importcsvimportrequestsfrombs4importBeautifulSoupoutfile=open("dataaa.csv","w",newline='')writer=csv.writer(outfile)page=0whilepag......
  • 基于Django的超市小程序+47822(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小
    基于django超市小程序摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,超市小程序被用户普遍使用,为方便用户能够可以随时进行超市小程序的数据信息管理,特开发了基于djan......
  • 【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管
    随着信息技术的迅猛发展,传统的医院挂号管理方式面临着效率低下、排队时间长、信息不对称等诸多问题。这些问题不仅影响患者的就医体验,也加重了医院工作人员的负担。在此背景下,基于Python的医院挂号管理系统应运而生。该系统旨在通过信息化手段优化挂号流程,提高管理效率,提升医疗......