Архивируем почту из 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 (в отличие от заметок, например). Благо, их у меня в архиве совсем немного (и я не уверен что вообще сейчас этот сервис), но подметил что при синхронизации они недоступны. Выгружу один раз руками.
Такие дела. Слава роботам!