← на главную

Алексей Батищев. Заметки обо всём, что происходит со мной и окружающим миром

Избранное в блоге: мои фото- и видеоработы, забрать своё из облаков, КЭНК

Архивируем почту из Gmail в Thunderbird

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

Подход Google дал значительную свободу в управлении почтой, но он принципиально противоречит классическому, когда у письма в почтовом ящике есть четкое место в иерархии папок. К сожалению, даже спустя почти два десятилетия удобного способа работы с Gmail из оффлайн клиентов не появилось — слишком плохо парадигма ярлыков ложится в общепринятый подход, на который рассчитаны универсальные клиенты. Для них одно (для Gmail) письмо с несколькими ярлыками — это несколько экземпляров письма, лежащих в разных папках, и это полнейшая шизофрения.

По совокупности нескольких факторов я выбрал для синхронизации и хранения локального архива почты Thunderbird. При действиях над письмами особый подход гугла показывает себя тут во всей красе.

Во первых, письма классически дублируются в разных папках, если в Gmail на них навешаны несколько ярлыков. Во-вторых удаление писем работает совершенно непредсказуемо: например, письмо может удалиться из одной папки и остаться в другой. Или полностью удалиться изо всех папок в Thunderbird включая корзину — но остаться болтаться в корзине веб-интерфейса Gmail (с ярлыками «Корзина» и остальными кроме первого, из папки которого вы его удаляли). А ещё, Thunderbird показывает папку All Mail — и значит по умолчанию пришедшие письма будут показаны два раза и во Входящих, и в ней. Но удалять письма из All Mail нельзя — они «воскресают» после повторной синхронизации, потому что по логике гугла в All Mail лежит всё и всегда, даже если оно без ярлыков.

Знатная бредятина и непонятное? Это ещё не всё. Описанное поведение — при умолчальных настройках Gmail и Thunderbird. А есть еще и другие варианты — поведение гугла при работе через IMAP описывается разделами в настройках «Когда я помечаю сообщение в IMAP как удаленное» и «Когда сообщение помечается как удаленное и стирается из последней видимой папки IMAP», а сам Thunderbird по умолчанию перекладывает письма в папку удалённые Gmail, но может их и стирать у себя (и передавать команду IMAP на сервер). Надо ли упоминать, что splitbrain с ярлыками тут тоже играет и внятного сценария получить не выйдет, письма продолжат дублироваться и воскресать? На самом деле, область исследований тут на небольшую диссертацию, возможно кто-то когда-то победит.

Хорошо, что мне от Thunderbird была нужна только архивация Gmail в оффлайн (и дальнейшая работа с архивом всей почты скопом) — щас расскажу как это победил.

Усмиряем ярлыкобесие

Итак, необходимо архивировать почту — то есть отбирать по какому-то критерию письма в ящике, синхронизированном с Gmail , и переносить их в отдельную локальную папку внутри базы Thunderbird. Для него это стандартная команда Archive, и с классическими почтовыми сервисами всё работает адекватно — письмо перекладывается в новую папку, из исходной папки пропадает, на сервере удаляется.

С Gmail команда Archive не работает: Thunderbird копирует письмо в заданную в настройках архивирования папку, однако из папки All Mail (Вся почта) оно не удаляется (точнее, пропадает и появляется вновь). Перетаскивание писем через drag-n-drop работает так же — они переносятся в локальную папку, а после синхронизации воскресают в All Mail. Поведение неинтуитивное, пользователи в интернетах ноют и получают рекомендации руками копировать письма, потом их удалять из All Mail, а потом еще и удалять из корзины внутри веб-интерфейса gmail. Но мы заставим работать роботов.

В Thunderbird есть механизм правил, где можно задать фильтр писем и действия, которые применяются над ними (можно применять правила на выделенные в интерфейсе письма или на папку целиком). Благодаря этому механизму запилен такой сценарий:

  • сделано правило для всех писем, подходящих под архивацию (я архивирую всё, что не отмечено звёздочкой в gmail, и это условие отбора)
  • первым действием в правиле копируются отобранные письма в локальную архивную папку
  • вторым действием в правиле отобранные письма удаляются

Командой в интерфейсе Thunderbird применяем правило на папку All Mail, а после его отработки нужно завершить шаманство, применив команду очистки Empty Trash на папку Thunderbird Корзина — именно так, потому что если зайти в Корзину и удалить письма, Gmail это благополучно игнорирует по своей безумной логике, и IMAP-некромант продолжит свой безумный танец. Почему очистку корзины и удаление писем из неё Thunderbird преобразует в разные для Gmail операции — вопрос к разработчикам Mozilla, это неинтуитивно но ок, просто запомним как мантру.

Кстати, еще один нюанс — переписки (chats), которые gmail хранит в себе, он не отдает в виде сущностей «почтовое сообщение» через IMAP (в отличие от заметок, например). Благо, их у меня в архиве совсем немного (и я не уверен что вообще сейчас этот сервис), но подметил что при синхронизации они недоступны. Выгружу один раз руками.

Такие дела. Слава роботам!