[PYTHON] Utilisez l'API pour modifier collectivement un grand nombre d'e-mails non lus dans Gmail à lire

La dernière fois a écrit comment supprimer tout à la fois, mais cette fois, j'écrirai sur la façon de le marquer comme lu.

Environnement d'exploitation

python3.8.3

API à utiliser

Il utilise une API appelée batchModify. En tant qu'utilisation, vous pouvez tout changer en même temps en définissant l'ID du courrier à supprimer et le contenu modifié (cette fois, supprimez l'étiquette non lue) dans le corps de la demande.

requestbody


            {
                'ids': [],
                "removeLabelIds": [
                "UNREAD"
                ]
            }

filtre ajouté

Lorsque je cherche le courrier pour la première fois, j'ajoute une condition pour que seuls les éléments non lus puissent être extraits.

python


            #Spécifiez une requête de recherche
            query += 'is:unread ' #Non lu seulement

Code source

En fait, le processus de mise à jour est effectué avec la source suivante.

GmailAPI.py


from __future__ import print_function
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
import time

class GmailAPI:

    def __init__(self):
        # If modifying these scopes, delete the file token.json.
        self._SCOPES = 'https://mail.google.com/'
        self.MessageIDList = []

    def ConnectGmail(self):
        store = file.Storage('token.json')
        creds = store.get()
        if not creds or creds.invalid:
            flow = client.flow_from_clientsecrets('credentials.json', self._SCOPES)
            creds = tools.run_flow(flow, store)
        service = build('gmail', 'v1', http=creds.authorize(Http()))
        
        return service

    def ModifyUnreadMessageList(self,DateFrom,DateTo,MessageFrom):
        try:

            #Connectez-vous à l'API
            service = self.ConnectGmail()
            self.MessageIDList = []
            
            query = ''
            #Spécifiez une requête de recherche
            query += 'is:unread ' #Non lu seulement
            if DateFrom != None and DateFrom !="":
                query += 'after:' + DateFrom + ' '
            if DateTo != None  and DateTo !="":
                query += 'before:' + DateTo + ' '
            if MessageFrom != None and MessageFrom !="":
                query += 'From:' + MessageFrom + ' '
            print("Date de début de la condition{0}Date de fin{1} From:{2}".format(DateFrom,DateTo,MessageFrom))

            #Obtenez une liste d'identifiants de messagerie(Jusqu'à 500)
            self.MessageIDList = service.users().messages().list(userId='me',maxResults=500,q=query).execute()
            if self.MessageIDList['resultSizeEstimate'] == 0: 
                print("Message is not found")
                return False

            #Extraire l'ID pour le lot
            ids = {
                'ids': [],
                "removeLabelIds": [
                "UNREAD"
                ]
            }
            ids['ids'].extend([str(d['id']) for d in self.MessageIDList['messages']])
            
            #Processus de mise à jour
            print()
            print("{0}Lire le début de la mise à jour".format(len(ids['ids'])))
            service.users().messages().batchModify(userId='me',body=ids).execute()
            print("Mise à jour terminée")

            return True
    
        except Exception as e:
            print("Une erreur est survenue")
            print(e)
            return False

if __name__ == '__main__':
    gmail = GmailAPI()

    #Puisqu'il y a une limite au nombre d'éléments qui peuvent être supprimés à la fois, répétez jusqu'à ce que les données cibles soient épuisées.
    for i in range(100):
        if (gmail.ModifyUnreadMessageList(DateFrom='2000-01-01',DateTo='2020-11-30',MessageFrom=None) == False):
            break
        if len(gmail.MessageIDList['messages']) < 500:
            #Quittez le processus
            break
        else:
            #Attendez 10 secondes
            time.sleep(10)

en conclusion

J'ai pu les marquer comme lus en bloc à l'aide de l'API. Si vous avez une grande quantité de courrier non lu, vous pouvez le mettre à jour plus rapidement que de l'exploiter à partir de l'interface graphique, alors veuillez en profiter.

Recommended Posts

Utilisez l'API pour modifier collectivement un grand nombre d'e-mails non lus dans Gmail à lire
Téléchargez un grand nombre d'images sur Wordpress
TensorFlow Pour apprendre d'un grand nombre d'images ... ~ (presque) solution ~
Convertissez un grand nombre de fichiers PDF en fichiers texte à l'aide de pdfminer
Comment créer une grande quantité de données de test dans MySQL? ??
Utilisez shutil pour supprimer tous les dossiers avec un petit nombre de fichiers
[Python] Comment mettre n'importe quel nombre d'entrées standard dans la liste
TensorFlow Pour apprendre d'un grand nombre d'images ... (Problème non résolu) → 12/18 Résolu
Différentes façons de lire la dernière ligne d'un fichier csv en Python
One-liner qui crée un grand nombre de fichiers de test à la fois sous Linux
J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
Comment lire les fichiers de numéros de série en boucle, les traiter et les représenter graphiquement
Résumé de l'utilisation de MNIST avec Python
Trouvez le nombre de jours dans un mois
Organisez un grand nombre de fichiers dans des dossiers
Comment créer une API Rest dans Django
Comment lire des fichiers dans différents répertoires
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
Consolider un grand nombre de fichiers CSV dans des dossiers avec python (données sans en-tête)
Utilisez slackbot comme relais et retournez de bouteille à slack au format json.
Un outil pour suivre les affiches avec un grand nombre de likes sur instagram [25 minutes à 1 seconde]
Trouvez une ligne directrice pour le nombre de processus / threads à définir sur le serveur d'applications
Comment utiliser le multitraitement python (suite 3) apply_async en classe avec Pool en tant que membre
Créer un ensemble de données d'images à utiliser pour la formation
Accélérez un grand nombre de requêtes simples dans MySQL
Remarques sur l'utilisation d'AIST Spacon ABCI
Un mémorandum sur l'utilisation de keras.preprocessing.image de Keras
Pratique pour utiliser les sous-graphiques matplotlib dans l'instruction for
Lire un grand nombre de rapports sur les titres en utilisant COTOHA
2 façons de lire tous les fichiers csv dans un dossier
Utilisez la date sur l'axe des x du tsplot représenté dans seaborn
[Python] Générer de manière aléatoire un grand nombre de noms de personne en anglais
[Python] Programmation pour trouver le nombre de a dans une chaîne de caractères qui se répète un nombre spécifié de fois.