Python
February 26, 2023

Как быстро удалить десятки тысяч писем из ящика Gmail, которые копились годами?

Гугл хочет денег

Знакомая надпись? А были времена, когда думалось, что в ящике места до одного места, когда оно ещё закончится. Но этот зверёк подкрался, и встал вопрос. Google ковыряя пол носком ботинка, смущенно предлагал вариант:

В сущности, не так много. Но с другой стороны, при сложившемся подходе и купленное место так же благополучно, а главное - бессмысленно, заполнится.

Так что решение должно быть иным. То есть, для начала надо отписаться от рассылок (одних оповещений от ф-буков, линкдинов, твиттеров и прочих ютубов было несколько десятков тысяч). Ну и вычистить это тонны не скажу чего.

Поиск привёл к библиотеке для Python под названием EzGmail. Это обёртка к API Gmail. Так что пойдём по проторенной дорожке.

Как выяснилось, есть нюанс. Авторизация скрипта в гугл-почте слегка мудрёная. Будьте внимательны и осторожны :)). Я настраивал по вот этой инструкции. Привожу вольный перевод. Ниже также дам набор ссылок по теме, которые при обнаруженном частичном дублировании друг друга тоже могут оказаться полезными.

Предполагается, что у вас на компе установлен Python версии не ниже 3.9. Если нет, то надо это сделать. Также надо иметь некий опыт написания скриптов на этом языке. И, разумеется, нужен редактор для написания и отладки скриптов (я использовал PyCharm Community Edition). Итак, поехали.

1. Устанавливаем библиотеку себе на комп через командную строку

pip install EZgmail

2. Создаём отдельную папку для нашего проекта. Это правда нужно, чтобы всё хранилось компактно и ничего потом не потерялось.

3. Откройте в браузере по умолчанию страницу с целевым ящиком Gmail, авторизуйтесь.

4. Перейдите по этой ссылке

5. Найдите там раздел "Настройте свою среду" и нажмите кнопку "Включить API"

6. Установите клиентскую библиотеку Google для Python:

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

7. В вашем каталоге из п. 2 создайте gecnjq файл quickstart.py и вставьте туда код с той же страницы

А вот запускать его, как написано у гугла, не нужно!

8. Переходите в вашу консоль

9. Нажмите на список выбора проекта и выберите создание нового проекта

В форме задайте название вашему проекту, например, ezgmail, организацию не заполняйте, нажмите кнопку Create.

В левой панели выберите последовательность APIs & Services -> OAuth consent screen

Выберите опцию external и нажмите create

Откроется форма Edit app registration. Заполните поля:

— App Information

  • App name = название проекта (н-р, ezgmail)
  • User support email = ваш адрес gmail
  • лого указывать не обязательно

— App domain

  • Проигнорируйте

— Authorized domains

  • проигнорируйте

— Developer contact information

  • указите ваш адрес

Нажмите save and continue

Секцию scopes можно проигнорировать, save and continue

Для секции Test Users нажмите кнопку +Add Users и введите ваш почтовый адрес, нажмите add, save and continue

Основная информация введена, жмите BACK TO DASHBOARD

Нажмите пункт Credentials в левой панели, должно быть что-то такое.

Нажмите+CREATE CREDENTIALS в верхней части затем выберите опцию OAuth Client ID .В списке Application type выберите Desktop App можно оставить предложенное название. Нажмите CREATE.

Появится форма, на которой будут Client ID и Client Secret вашего приложения. Ни с кем ими не делитесь. Сохраните данные - нажмите кнопку DOWNLOAD JSON. Скачанный файл переместите в папку с вашим проектом.

Верификация приложения в Gmail. Перейдите в вашу рабочую папку на компе. Запустите терминальный режим работы интерпретатора Python

python>

Введите следующий код

import ezgmail

Откроется окно, похожее на это. Нужно нажать Continue или Продолжить

В рабочей папке должен появиться файл token.js

В командной строке Python введите

ezgmail.init()

Всё, можно работать (из командной строки Python можно выходить). Пора создавать свой скрипт-чистильщик и запускать его уже из редактора скриптов.

Привожу свой скрипт, который на данный момент удалил уже несколько десятков тысяч сообщений (в среднем одно сообщение - порядка 100 Кб). То есть, welcome back, гигабайты свободного места :).

# -*- coding: utf-8 -*-
# Описание метода массовой очистки Gmail
import ezgmail
import time
import random
''' Создаём список ключевых слов, по которым нужно искать письма. Рекомендую использовать почтовые адреса.
Потому что, если указать, например, 'youtube', будут найдены не только письма от ютуба, но любые его упоминания и будут беспощадно удалены. Под раздачу могут попасть нужные сообщения
В остальном всё просто.
Почему-то библиотека стандартно выбирает 500 сообщений, хотя я пробовал и без лимита, и с разными лимитами - нет, больше 500 не берёт.
К сожалению, идея посчитать, сколько было сообщений по каждому КС пришла поздно, удалось посчитать лишь "остатки". Самый "жир" был удалён без подсчёта :(
В общем, сохраняем итоги работы в словарь result '''
result = {}
keywords1 = ['@twitter.com', 'facebookmail.com', 'noreply@youtube.com', 'targetmarketingmag.com', 'email.alibaba.com', '@linkedin.com', '@socialmediaexaminer.com', '@businessblogshub.com', '@ironcad.com', '@explore.pinterest.com', 'dns-shop.ru', 'mvideo.ru','e-xecutive.ru', 'aliexpress.com', 'productlaunchformula.com', 'intellectmoney@', '@m-i-f.ru', '@e.geekbrains.ru', 'noreply@medium.com', 'noreply@dreamstime.com', '@plus.google.com', '@flickr.com', '@plus.google.com', '@academia-mail.com', '@livejournal.com', '@xing.com', '@explore.pinterest.com', 'quora.com', '@grebenukresulting.ru', '@dasreda.ru', '@bclas.ru', '@afanasev.pro', '@pinterest.com', '@slidesharemail.com', '@new.myspace.com', '@upviral.com', '@soundcloud.com', 'weekly@megaplan.ru', '@mashable.com']
keywords2 = ['@fin-1.com', '@maed.ru', '@n.dribbble.com', '@blog-emails.ingate.ru', '@news.ozon.ru', '@youtube.com']
keywords = keywords1 + keywords2
for keyword in keywords:
    result[keyword] = 0
    ''' Я не стал разбираться, почему библиотека берет только первые 500 сообщений. Просто сделал цикл, а количество удалённых сохраняю в словарь'''
    while len(ezgmail.search(keyword, 1000)) > 0:
        result[keyword] += len(ezgmail.search(keyword, 1000))
    ''' Делаем небольшую паузу, чтобы Gmail не завозмущался от такого частого обращения. Хоть приложение и авторизовано, будем аккуратны :)'''
        time.sleep(random.randint(1, 3))
        threads = ezgmail.search(keyword, 1000)
        print(f'Нашлось {len(threads)} сообщений с ключевиком "{keyword}"')
        print(f'Удаляем сообщения с ключевиком  "{keyword}"')
        for i in range(len(threads)):
            threads[i].trash()
            # Выводим счётчик, чтобы не было скучно и было ясно, что что-то происходит :)
            print(f'"{keyword}" - {i}')
            time.sleep(random.randint(1, 3))
    print(f'"{keyword}" - {result[keyword]}')
    print(result)

Скрипт рабочий, пашет до сих пор. Несколько предостережений:

- я не пробовал запускать скрипт с сервера, работает с компа, возможно, с сервера будет побыстрее

- внимательно прочитайте комментарии в коде

- все сообщения, удалённые скриптом, переместятся в корзину - не забудьте её потом очистить

- скрипт ищет во всей почты, включая папки, которые вы создали для каких-то целей, и сообщения, находящиеся там, вам нужны - они будут удалены

- если у вас есть сообщения, которые вы пометили звёздочкой как избранное и они вам нужны, нужно дополнение для скрипта, которое будет учитывать этот маркер; используйте метод search, например

starred = ezgmail.search('is:starred ', 1000)

Доступ к сообщениям в этом наборе данных вот такой:

print(starred[0].messages[0].subject)
print(starred[0].messages[0].sender)
print(starred[0].messages[0].timestamp)
print(starred[0].messages[0].snippet)
print(starred[1].messages[0].subject)
print(starred[1].messages[0].sender)
print(starred[1].messages[0].timestamp)
print(starred[1].messages[0].snippet)

итд.

Вроде всё. Задавайте вопросы в комментах. Возможно, смогу помочь. Или не смогу ;).

Да, обещанные ссылки

https://towardsdatascience.com/declutter-your-gmail-inbox-with-python-e06a4102b0b7
https://morioh.com/p/0b41bf454e29
https://www.geeksforgeeks.org/handling-mails-with-ezgmail-module-in-python/
https://pypi.org/project/EZGmail/
https://ezgmail.readthedocs.io/en/latest/
https://vegibit.com/how-to-use-python-ezgmail/

Благодарность в виде доната приветствуется 😉. Как говорят восточные зулусы, buy me a coffee 😃

👇