I wrote a previous article, "Getting mail from the Gmail API using Python" (https://qiita.com/orikei/items/73dc1ccc95d1872ab1cf). As an extension of that, I tried to delete all past emails using API.
python3.8.3
We use an API called batchDelete. As a usage, you can delete all at once by passing the ID of the mail to be deleted to the request body as a list.
Specify SCOPE when connecting to the Gmail API. Last time, it was OK only for acquisition, so it was OK with Read Only, but this time it will be deleted, so it is necessary to change to SCOPE that can be fully accessed. Also, note that if you change SCOPE in the middle, you need to delete the'token.json'file. If you do not delete it, the changes will not be reflected. Reference: Choose Auth Scopes (from Gmail API page)
python
    def __init__(self):
        #If you change the Scope, token.To remove json
        self._SCOPES = 'https://mail.google.com/' #Specify full access SCOPE
        self.MessageIDList = []
        self.MessageList = []
    def ConnectGmail(self):
        #Connect to Gmail API
        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
Actually, the deletion process is performed with the following source. ** * When you execute it, the mail is actually deleted, so please be careful about the conditions you specify. ** **
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 DeleteMessageList(self,DateFrom,DateTo,MessageFrom):
        try:
            #Connect to API
            service = self.ConnectGmail()
            self.MessageIDList = []
            
            query = ''
            #Specify a search query
            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("Deletion condition start date{0}End date{1} From:{2}".format(DateFrom,DateTo,MessageFrom))
            #Get a list of email IDs(Up to 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
            #Extract ID for batchDelete requestbody
            ids = {
                'ids': []
            }
            ids['ids'].extend([str(d['id']) for d in self.MessageIDList['messages']])
            
            #Delete process
            print("{0}Delete processing started".format(len(ids['ids'])))
            service.users().messages().batchDelete(userId='me',body=ids).execute()
            print("Deletion completed")
            return True
    
        except Exception as e:
            print("An error has occurred")
            print(e)
            return False
if __name__ == '__main__':
    gmail = GmailAPI()
    #Since there is a limit to the number of items that can be deleted at one time, iteratively processes until the target data is exhausted.
    for i in range(100):
        #Call the deletion process by specifying arbitrary conditions (period and From address)
        if (gmail.DeleteMessageList(DateFrom='2010-01-01',DateTo='2020-10-30',MessageFrom='[email protected]') == False):
            break
        if len(gmail.MessageIDList['messages']) < 500:
            #Exit the process
            break
        else:
            #Wait 10 seconds
            time.sleep(10)
I tried to delete the mail using API. I think it's easier than deleting it with the Gmail GUI, so I hope you can refer to it.
Recommended Posts