"ЧИСТАЯ ПОЧТА"

"ЧИСТАЯ ПОЧТА"

@volond


Правильный канал о Таблицах (Google Sheets): @google_sheets

Чат канала: @google_spreadsheets_chat



В течение последних шести месяцев моя учетная запись Gmail была настроена на автоматическое удаление заaрхивированной почты через 7 дней, которая не была помечена ⭐️ или указана как важная. 

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

Я смог настроить это, используя очень простой сценарий программирования, работающий в собственной службе Google Apps Script, которая позволяет вам писать Javascript подобный код для взаимодействия со многими службами Google;

Но почему?

За последние пять лет я заметил, что большинство писем, приходящих в мой личный почтовый ящик, изменилось. Разговоры с друзьями и семьей в основном переместились в мессенджеры, такие как Viber и Telegram. Тем временем я старательно отписался от любых нежелательных информационных бюллетеней.

Остается то, что я классифицирую как электронные письма с уведомлениями, и они, вероятно, составляют 95% электронной почты, которую я получаю изо дня в день. Например, такие сообщения:

"Ваша посылка отправлена!"

или

«Была одобрена крупная транзакция по кредитной карте».

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

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

Сделайте резервную копию своего почтового ящика, прежде чем продолжить

Поскольку мы собираемся массово удалять электронную почту с помощью инструментов, которые мы не совсем понимаем, вероятно, вам стоит сделать резервную копию всего почтового ящика Gmail в автономном режиме, прежде чем продолжить. Для этого вы можете использовать службу извлечения Google, которую можно найти по адресу https://takeout.google.com .

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

Вы можете видеть, что он собирается заархивировать электронное письма вформат mbox. Затем его можно открыть на своем компьютере с помощью бесплатных почтовых клиентов, таких как Apple Mail или Mozilla Thunderbird.

Затем прокрутите вниз до самого низа и нажмите « Далее» , выберите способ доставки по электронной почте и нажмите « Создать экспорт» .




Через несколько часов вы получите электронное письмо со ссылкой для загрузки архива электронной почты в виде zip-файла.

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


Панель инструментов скрипта приложений Google Apps

Теперь, когда мы проверили нашу резервную копию, давайте продолжим и создадим сценарий, который автоматически очистит наши старые электронные письма. Начните с перехода на панель инструментов Apps Script, расположенную по адресу https://script.google.com .

Если вы посмотрите на боковую панель навигации, вы в настоящее время находитесь на вкладке «Мои проекты».

Нажмите « Новый проект» в верхнем левом углу, и новый проект откроется в простой интегрированной среде разработки.

Иногда процесс создания "зависает" ,поэтому делаю так:

1.Нажать на кнопку "Новый проект"
2.Дождаться когда перекинет на новое окно и выделит ID проекту
3 Скопировать его из адресной строки
4 Закрываем вкладку
5 Создаем новую и вставляем ранее скопированный адрес из буфера обмена



В левой панели вы можете увидеть список файлов, включенных в этот проект. По умолчанию должен присутствовать один файл с именем «Код.gs», созданный автоматически. Поскольку этот проект будет относительно простым, это единственный файл, который нам понадобится.


Триггеры скриптов приложений Google Apps

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


К счастью, Apps Script предоставляет триггеры, которые могут вызывать функции проекта. Однако есть одна проблема, с которой нам придется столкнуться:

Google устанавливает ограничение в 20 триггеров, а завершенные триггеры не удаляются автоматически. 

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

Скрипт очистки электронной почты

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

В верхней части скрипта мы определяем константу с именем, PAGE_SIZE и установим ее значение по умолчанию равной 150. Это количество сообщений, которые наша функция очистки будет пытаться удалить каждый раз при вызове.

// Maximum number of message threads to process per run.
var PAGE_SIZE = 150

Удаление писем - довольно медленный процесс, и скрипт приложений устанавливает 6-минутный тайм-аут для всех вызовов функций. Поэтому, если вам нужно удалить тысячи писем, вы не можете сделать это за один раз. По этому удаление 150 сообщений занимает около 30 секунд, что является очень безопасным значением по умолчанию.

Затем мы определяем функцию setPurgeTrigger, которая создает новый триггер Apps Script, который будет ежедневно вызывать функцию purge . Это функция, которую вам нужно будет выполнить вручную, чтобы установить скрипт позже, когда мы все настроим.

function setPurgeTrigger() {
  ScriptApp.newTrigger('purge').timeBased().everyDays(1).create()
} 

После этого мы определяем функциюsetPurgeMoreTrigger, которая вызовет функцию  purgeMore через 2 минуты.

function setPurgeMoreTrigger() {
  ScriptApp.newTrigger('purgeMore')
    .timeBased()
    .at(new Date(new Date().getTime() + 1000 * 60 * 2))
    .create()
}

Далее у нас есть функция removePurgeMoreTriggers. Это необходимо, потому что в большом почтовом ящике может быть установлено более 20 триггеров , которые, если не удалить их, вызовут ошибки из-за ограничения проекта в 20 триггеров. Здесь мы удаляем только те триггеры, которые являются функцией обработчика purgeMore.

function removePurgeMoreTriggers() {
  var triggers = ScriptApp.getProjectTriggers()
  for (var i = 0; i < triggers.length; i++) {
    var trigger = triggers[i]
    if (trigger.getHandlerFunction() === 'purgeMore') {
      ScriptApp.deleteTrigger(trigger)
    }
  }
}


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


function removeAllTriggers() {
  var triggers = ScriptApp.getProjectTriggers()
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i])
  }
}
После этого идет определение  функции purgeMore. Это просто оболочка для нашей основной функции function purge() {
  removePurgeMoreTriggers()
  ...
}

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

function purgeMore() {
  purge()
}

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

function purge() {
  removePurgeMoreTriggers()
  ...
}

Затем мы определяем нашу строку поиска и сохраняем ее в переменной с именем search . Затем мы передаем эту строку поиска методу GmailApp.search и возвращаем соответствующие потоки. Любое письмо, соответствующее этому поисковому запросу, будет удалено следующим кодом.

function purge() {
  ...
    var search = 'in:inbox -in:starred -in:important older_than:' + DELETE_AFTER_DAYS + 'd'
    var threads = GmailApp.search(search, 0, PAGE_SIZE)
  ...
}

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

function purge() {
  ...
    if (threads.length === PAGE_SIZE) {
        console.log('PAGE_SIZE превышено. Установка триггера для вызова функции purgeMore через 2 минуты.')
        setPurgeMoreTrigger()
      }
  ...
}

Наконец, для каждого объекта GmailThread, который соответствует нашему поисковому запросу, мы проверяем, не старше ли последнее сообщение в потоке, чем наша константаDELETE_AFTER_DAYS. В таком случае мы переместим весь поток в корзину, вызвав метод moveToTrash объекта.

function purge() {
  ...
  var cutoff = new Date()
  cutoff.setDate(cutoff.getDate() - DELETE_AFTER_DAYS)

  // For each thread matching our search
  for (var i = 0; i < threads.length; i++) {
    var thread = threads[i]

    // Only delete if the newest message in the thread is older then DELETE_AFTER_DAYS
    if (thread.getLastMessageDate() < cutoff) {
      thread.moveToTrash();
    }
  }
}

Установка скрипта

Давайте дадим осмысленное имя нашему проекту.

А также перенесем в него код из pastiebin.com



Выполним нашу функцию purge вручную, чтобы убедиться, что она работает. Вы можете сделать это, выбрав функцию purge на панели инструментов выполнения и нажав кнопку воспроизведения.



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


Как я уже упоминал ранее, поскольку мы удаляем только 150 писем за раз, для удаления всего может потребоваться несколько циклов. Следите за вкладкой «Выполнения» на панели инструментов «Скрипт приложений», чтобы убедиться, что скрипт по-прежнему повторно запускается для получения новых 150 сообщений каждые пару минут.


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


Управление электронной почтой

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

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

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

Продублирую еще раз код

С миру по нитке в моем канале:

Ваш @Volond







Report Page