Оглавление

Gmail умеет много чего, но одной простой вещи ему до сих пор не хватает. Нельзя штатно взять и сказать: удаляй письма из «Промоакций» или «Соцсетей» через 7, 14 или 30 дней. Фильтры есть, категории есть, поиск мощный, а режима «подожди N дней и потом убери это из жизни» нет. В итоге ящик годами копит рассылки, магазины, соцсети, уведомления сервисов и форумы, пока не превращается в склад цифрового хлама.

Когда таких писем немного, их еще можно чистить руками. Когда почта старая и живая, а на нее годами летит всё подряд, ручная уборка быстро становится занятием для людей с крепкой психикой и лишним временем. Особенно бодро это ощущается в момент, когда Google начинает намекать на нехватку места, а в «Промоакциях» лежат письма времен археологической молодости интернета.

Я решил не играть в почтового дворника вручную и собрал простую схему через Google Apps Script. Идея понятная: скрипт по расписанию ищет старые письма в нужных категориях и переносит их в корзину. Дальше Gmail уже сам доводит дело до конца по своему обычному циклу хранения.

Что именно будем чистить

В моем варианте скрипт работает с четырьмя стандартными категориями Gmail:

  • Promotions
  • Social
  • Updates
  • Forums

При этом он не трогает письма, которые уже находятся в корзине, отмечены звездочкой или помечены как важные. Это не броня от всех бед, но для нормальной бытовой автоуборки такой защиты обычно хватает.

Почему обычных фильтров Gmail здесь мало

Обычные фильтры Gmail умеют многое. Можно сразу пометить письмо, архивировать, отправить в спам, удалить, повесить ярлык. Но у фильтров нет нормального режима отложенной уборки. Они не умеют действовать по принципу «сначала пусть письмо полежит две недели, а потом его можно выбросить».

А это как раз тот сценарий, который нужен для рассылок, уведомлений магазинов, служебных писем и прочих вещей, которые сегодня еще могут пригодиться, а через неделю уже становятся пылью в углу. Через Apps Script эта проблема решается без большого цирка: Gmail отдает результаты поиска, скрипт берет найденные цепочки и переносит их в корзину.

Показываю, как настроить автоочистку категорий Promotions, Social, Updates и Forums в Gmail через Apps Script, чтобы почта не превращалась в цифровой чулан.

Рабочий скрипт для автоочистки Gmail

Ниже тот самый рабочий вариант. У меня стоит срок 14 дней, но его можно поменять на 7, 30 или любое другое разумное значение.

function deleteOldPromotions() { const daysOld = 14; const queries = [ `category:promotions older_than:${daysOld}d -in:trash -is:starred -label:important`, `category:social older_than:${daysOld}d -in:trash -is:starred -label:important`, `category:updates older_than:${daysOld}d -in:trash -is:starred -label:important`, `category:forums older_than:${daysOld}d -in:trash -is:starred -label:important` ]; for (const query of queries) { moveThreadsByQueryToTrash(query); } } function moveThreadsByQueryToTrash(query) { const batchSize = 100; while (true) { const threads = GmailApp.search(query, 0, batchSize); if (!threads.length) break; GmailApp.moveThreadsToTrash(threads); Utilities.sleep(500); } }
Показываю, как настроить автоочистку категорий Promotions, Social, Updates и Forums в Gmail через Apps Script, чтобы почта не превращалась в цифровой чулан.

Что делает этот код

Логика здесь простая и без шаманства. Сначала задается переменная daysOld. В моем примере это 14 дней. Потом собирается массив поисковых запросов Gmail, по одному на каждую категорию. Каждый запрос ищет письма старше заданного возраста и одновременно исключает корзину, starred-письма и важные цепочки.

Дальше основной цикл перебирает запросы и передает их в отдельную функцию. Эта функция забирает результаты пачками по 100 цепочек, переносит их в корзину и делает короткую паузу в полсекунды. Пауза нужна не ради красоты. Так скрипт ведет себя спокойнее и не пытается долбить Gmail без остановки, как будто его кто-то обидел в детстве.

Почему именно цепочки, а не отдельные письма? Потому что Apps Script через GmailApp.search() возвращает именно threads. Для задач такого типа это даже удобно: меньше ручной возни и более естественное поведение для Gmail, где переписка и так собрана в цепочки.

Как запустить это в Google Apps Script

Делается все прямо из браузера. Открываешь Google Apps Script, создаешь новый проект, вставляешь код и сохраняешь его. Дальше в выпадающем списке выбираешь функцию deleteOldPromotions и запускаешь ее вручную первый раз.

На первом запуске Google попросит доступ к Gmail. Это нормальный этап, потому что скрипт собирается искать письма и переносить их в корзину. Если код написал ты сам и запускаешь его у себя в аккаунте, предупреждение про непроверенное приложение в этом случае ожидаемое. Тут важно не нажимать всё подряд на чужом коде, а для своего проекта просто внимательно пройти выдачу разрешений.

После первого запуска уже можно переходить к автоматизации и вешать триггер по времени. Именно он и превращает скрипт из разовой игрушки в нормальную уборку по расписанию.

Какой триггер выбрать

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

У меня рабочая логика простая: источник события по времени, тип триггера по часам, интервал раз в час. Это не догма. Главное, чтобы функция вообще была привязана к расписанию. Иначе весь этот проект быстро превращается в красивую идею, которая живет только в редакторе Apps Script.

Какая ошибка у меня вылезла

При настройке я словил типичную мелкую, но противную ошибку:

TypeError: daysOld is not a function

Причина оказалась банальной. В одной из строк шаблонной строки легко случайно поехать пальцами и написать выражение так, будто daysOld это функция. JavaScript на такое не философствует и сразу отправляет с ошибкой.

Лечится это просто: все запросы должны быть записаны одинаково, через шаблонную строку с ${daysOld} внутри, без лишних скобок, фантазий и самодеятельности. Если Apps Script ругается на подобную ошибку, первым делом надо смотреть именно строку с поисковым запросом, а не искать мистику в триггерах, правах доступа и фазах луны.

Как проверить, что скрипт реально работает

Самая простая проверка делается сразу после ручного запуска. Открываешь Gmail и смотришь корзину. Если туда начали переезжать старые письма из Promotions, Social, Updates и Forums, значит схема живая.

Вторая точка проверки это журнал выполнения и раздел триггеров в Apps Script. Там видно, запустилась ли функция, завершилась ли она без ошибки и когда был последний успешный проход. Это полезно, потому что иногда кажется, будто все уже автоматизировано, а на деле триггер не создан, права не выданы или запуск сыпется на каком-нибудь пустяке.

Если хочется перестраховаться, можно сначала поставить срок не 14 дней, а, скажем, 1 день на тестовом запуске и посмотреть, что именно начнет улетать в корзину. После проверки вернуть нормальное значение и жить дальше уже без ручной археологии.

Показываю, как настроить автоочистку категорий Promotions, Social, Updates и Forums в Gmail через Apps Script, чтобы почта не превращалась в цифровой чулан.

Что важно знать про корзину

Скрипт не удаляет письма навсегда в ту же секунду. Он переносит их в корзину, и это как раз хорошо. Если сработал слишком бодрый пылесос, у тебя остается шанс быстро вытащить нужную цепочку обратно.

Но тут есть важный нюанс. Пока письма лежат в корзине, это еще не финальная точка. Gmail позже удаляет их окончательно по своему обычному циклу. Так что если хочется освободить место прямо сейчас и без ожидания, корзину иногда все равно имеет смысл открыть и дочистить вручную. Иначе это уже не уборка, а просто перекладывание хлама из комнаты в коридор.

Что еще можно допилить

Этот скрипт легко расширяется под свой сценарий. Например, можно:

  • исключить конкретных отправителей;
  • не трогать письма с отдельными ярлыками;
  • чистить только часть категорий;
  • задать разный срок хранения для разных категорий;
  • добавить логирование, чтобы видеть, сколько цепочек было убрано за запуск.

Например, Promotions можно держать 14 дней, Social только 7, а Updates, наоборот, 30. Для этого достаточно не одного массива с одинаковым сроком, а отдельных запросов с разными значениями. Магии тут нет, только чуть больше аккуратности в коде.

Где у такого решения границы

Это удобная бытовая автоматизация, а не корпоративная почтовая политика уровня Google Workspace Admin. Скрипт работает в рамках твоего аккаунта и твоих прав, а значит его надо воспринимать как личного уборщика для собственного Gmail, а не как универсальную систему архивирования и управления почтой для всей организации.

Еще один практический момент: если ты активно пользуешься категориями и иногда находишь в них полезные письма через неделю или две, срок хранения надо выбирать без фанатизма. Иначе можно слишком хорошо оптимизировать ящик и потом самому же искать, куда делось то самое письмо со скидкой, подтверждением или нужным уведомлением от сервиса.

Итог

Если Gmail годами копит рассылки, соцсети и служебные уведомления, рано или поздно начинается ручная археология. И вот тут Google Apps Script реально выручает. Пара десятков строк кода, один триггер, и почта начинает вести себя как взрослый сервис, а не как бесконечный склад рекламных листовок.

Решение получилось простое, понятное и без лишнего цирка. Самое приятное в нем то, что его легко подстроить под себя. Хочешь 7 дней — ставишь 7. Хочешь исключить важные письма — исключаешь. Хочешь чистить еще и форумы — добавляешь category:forums. Google штатно такого сценария не дал, значит делаем сами. И в этот раз, что особенно приятно, без ночных логов Nginx и без приключений на стороне сервера.