ズボラだから、Gmail APIで不要なメールを一括削除したよー

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

当記事のプログラムでなにかあっても、一切の責任を負いませんのでご注意ください。あとAPIの使用量によってはお金が発生する場合があります。

Gmailから「容量いっぱいで受け取れない」と怒られたので、一括削除したよー。私用のどうでもいいメールだったから、重要とかスター付きを除外して削除。

事前準備

・python環境の構築 -> おまかせする
・Gmail APIのcredentialsファイルを取得

  1. ここ にアクセス
  2. Enable the Gmail API をクリックして、 credentials.json をダウンロード
  3. プログラムと同じディレクトリに設置する

ソースコード

github: umentu/blog_gmail_python


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

SCOPES = ['https://mail.google.com/']

# この日以前のメールが削除対象
# BEFORE_DATE = 'YYYY-mm-dd'
BEFORE_DATE = '2019-01-01'

def main():

    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)
    users = service.users()

    """
    -is:important で重要メールを外す
    -is:starred でスター付きメールを外す
    それ以外のフラグは https://support.google.com/mail/answer/7190?hl=ja を参照
    """
    meta_data = users.messages().list(userId='me', q='before:{} -is:important -is:starred'.format(BEFORE_DATE)).execute()

    while len(meta_data['messages']) > 0:
        remove_list = []
        for m in meta_data['messages']:
            print(m['id'])
            remove_list.append(m['id'])

        users.messages().batchDelete(userId='me', body={'ids': remove_list}).execute()

        meta_data = users.messages().list(userId='me', pageToken=meta_data['nextPageToken']).execute()


if __name__ == '__main__':
    main()

見ての通り、大したプログラムではなくて、

  1. アクセス
  2. クエリを実行して条件にあったメールのidを取得
  3. idを集めて一括削除
  4. nextPageTokenを元にまたメールのidを取得
  5. メールがなくなるまで3. 4. を繰り返し

という感じ。

実行時に、ブラウザでgoogleのアクセス確認が出るので、それを許可すれば徐々に実行される。

Related posts

コメントを残す