Google, куди ти подів моє місце в GMail? А ви точно знаєте, як в GMail працюють ярлики?


Став я помічати, що з 15 гігабайт безкоштовного місці, наданого Google, у мене пошта займає вже майже 12 гігабайт. І така тенденція мене не радує.
З іншого боку я в якості поштового клієнта використовую Thunderbird з повною синхронізацією. Тобто всі листи повинні бути закачано. Так ось папка Thunderbird з усіма листами та індексами займає всього 3 гігабайти. Хоча за логікою речей розмір повинен не просто більш менш співпадати із зайнятим місцем на GMail, а бути побільше, т. к. Thunderbird не архівує листи, а зберігає як є і ще індекси будує для прискорення пошуку.
Проблема на обличчя! Починаємо докопуватися до суті.

Почав я з того, що зайшов в ярлик (так, у випадку з GMail правильно говорити саме ярлик, а не папка, подробиці тут) «Вся пошта» і побачив, що у мене трохи більше 500 тисяч повідомлень. Ситуація ускладнювалася тим, що у мене близько 100 ярликів! А ярлики в GMail — це типові папки в Thunderbird. Як швидко підрахувати загальну кількість листів в Thunderbird я не знайшов. Але забігаючи вперед скажу, що в ньому у мене їх близько 200 тисяч. Звідси стає зрозуміло, чому на диску місце займається менше.
Але залишається все одно все той же питання: що це за такі 300 тисяч повідомлень GMail, які не видно в Thunderbird, але займають місце на GMail?

Допитливість розуму + бажання не поспати вночі + бажання помацати Go на реальній задачі привели мене до рішення, що треба взяти компілятор Go, вивчити GMail API і подивитися, що ж там під капотом у GMail.
Зовсім коротко про враження про GoТільки самий ледачий не писав про обробку помилок в Go. Тільки на них я і звернув увагу більш пильно.
В іншому:
  • Почав писати на наступний вечір
  • Ще одна мова

  • Життя змусить — буду писати і на Go
  • Для мене і C/C++, Python, Java (і PHP теж) — теж собі мови для своїх ніш
  • Напевно я просто всеїдний
Та і стаття не про Go.

Як я вище зазначив, у мене близько сотні ярликів. Листи зазвичай мають один ярлик. І мені захотілося з'ясувати, скільки листів у мене позначені кожним ярликом і скільки вони займають місця.
Я не знайшов способу дізнатися в web-інтерфейсі GMail розміри ярликів (обсяг листів, позначених тим чи іншим ярликом).
Засукав рукава, встановив компілятор Go, підняв у Docker контейнері MongoDB (Так, я такий от збоченець! Але це мій pet project і що хочу, те і використовую, особливо в навчальних цілях) та став говнокодить творити.
Далі я буду посилатися на ось цей мій проект.
Забираю всі свої мітки з GMail і складаю їх в базу Users.labels: list:
GMailMessagesSize -importLabels -mongoConnectionString 10.211.55.5
Imported labels: 112

Забираю ID всіх повідомлень, які є в ящику Users.messages: list:
GMailMessagesSize -mongoConnectionString 10.211.55.5 -importMessages
Processed 100 messages
Processed 200 messages
Processed 300 messages
.......
Processed 523100 messages
Processed 523115 messages

Забирається звичайно не швидко, але як тут распараллелиться я не знайшов (API не дозволяє).
Поки у нас є тільки список ID повідомлень, а нам треба про кожне повідомлення знати його ярлики і розмір. Для цього є метод Users.messages: get. Але відпрацьовує він не швидко, навіть не дивлячись на те, що в запиті я вказую які саме поля мене цікавлять (internalDate, labelIds, sizeEstimate).
Реалізацію Batching Requests я щось не знайшов.
Але я ж пишу на Go і гріх не використовувати горутины! Сказано — зроблено. Тягнемо інформацію кількість потоків (скільки захочемо, але я поставив обмеження у 50). Якщо інтернет швидкий і комп не тупить, то починаємо швидко впиратися в ліміт рейта запитів від Google. Скрипт можна зупинити і продовжити, а можна просто наполегливо чекати, т. к. при спрацьовуванні ліміту горутины сплять по 5 секунд і потім продовжують мучити Google. Так, можна було б кожного разу збільшувати час сну, наприклад, в два рази і не забути про обмеження зверху. Але в цьому випадку прості 5 секунд цілком собі рішення.
Я свої 500 тисяч листів обробив сумарно, здається, приблизно за 3 години. Загалом час осудна.
GMailMessagesSize -mongoConnectionString 10.211.55.5 -processMessages -procNum 20
............................Procecced 100 messages
............................Procecced 200 messages
............................Procecced 300 messages
....
............................Processed 523100 messages
............................Processed 523115 messages

Там не тільки точки вискакували. Якщо впертися в ліміт, то замість точки S (sleep) або може бути повідомлення було видалено, то NF (NotFound).
У результаті всіх перерахованих вище страждань в MongoDB є колекція етикеток колекція повідомлень:
{ 
"SizeEstimate" : NumberLong(63422), 
"_id" : ObjectId("5677188d2afd90a80e5e06f2"), 
"id" : "136b83b1ff739dec", 
"internaldate" : ISODate("2012-04-15T22:47:51.000+0000"), 
"labelids" : [
"CATEGORY_PROMOTIONS"
], 
"processed" : true
}

Тепер під рукою є всі дані, щоб почати їх аналізувати.
Спочатку я вирішив експортувати в CSV інформацію по ярликах, кількістю повідомлень і їх сумарний розмір.
GMailMessagesSize -mongoConnectionString 10.211.55.5 -showSizes
LabelId;Label name;Messages size;Messages count
Label_11;Archives;21279;4
Label_12;Archives/2012;18684;3
CATEGORY_FORUMS;CATEGORY_FORUMS;519396295;30038
CATEGORY_PERSONAL;CATEGORY_PERSONAL;5040188875;268116
CATEGORY_PROMOTIONS;CATEGORY_PROMOTIONS;2990655727;36508
CATEGORY_SOCIAL;CATEGORY_SOCIAL;205976374;6553
CATEGORY_UPDATES;CATEGORY_UPDATES;2769764066;180729
CHAT;CHAT;0;0
DRAFT;DRAFT;82817;6
IMPORTANT;IMPORTANT;6600492209;159268
INBOX;INBOX;40306538;334
UNREAD;UNREAD;479586429;11678
.....
Label_97;INBOX/Coursera;6021524;151
Label_77;INBOX/Тимчасова;1077571;28
Label_63;INBOX/Відповісти!!!;6195999;12
Label_67;INBOX/Поїздка в США;1693366;11

Це CSV, який мені було зручно відкрити в Excel і повивчати (посортировать і фільтрувати).

І ось на цьому етапі я серйозно задумався. Що таке гигов 6 якихось важливих ( з ярликом IMPORTANT ) повідомлень? Що таке 11678 непрочитаних повідомлень (з ярликом UNREAD)? У мене (як я думав) всі прочитані повідомлення! Навіть якщо в рядку пошуку GMail ввести label:unread, то він виводить всього 106 непрочитаних повідомлень! Що відбувається?

Гугление даній ситуації призвело до форумів, де інші задавалися питанням — чому віддалені в Thunderbird повідомлення не видаляються в GMail? Ну там багато різних випадків. Я вам розповім про найбільш, на мій погляд, сумний.

На цьому місці ті, хто користується GMail'ом виключно в браузері можуть пошкодувати, що почали читати цю статтю. АЛЕ!!! Ви, можливо, читаєте пошту в тому числі з мобільного. І можливо у вас там не рідний клієнт GMail. У такому разі, можливо у вас така ж проблема, як і в мене!

Не буду далі мучити і розповім, що ж все таки відбувається.
Слідкуйте за руками. Послідовність подій така:
  1. Приходить лист GMail
  2. Листа призначається ярлики INBOX, UNREAD і (ось тут важливо) можливо ще якийсь додатковий ярлик, наприклад CATEGORY_PROMOTIONS
  3. В поштовому клієнті ви відкрили лист. Ярлик UNREAD знявся.
  4. В поштовому клієнті ви видалили лист
  5. Барабанний дріб: ярлик INBOX знявся. І… все, більше нічого
  6. повідомлення залишився ярлик CATEGORY_PROMOTIONS
Повідомлення з ярликом CATEGORY_PROMOTIONS відображаються, якщо в пошуку набрати: category:promotions Часто ви так робите?
Якщо зовсім коротко, то листи просто не видаляються! Я їх видаляю, а вони залишаються на GMail.
Тут саме час згадати про резервне копіювання листів. І схоже, що це той самий випадок!
Коли в Thunderbird видалення налаштоване через «Пометить на удаление», потім «Стиснення»:

І те, що стоїть галка поміщати в кошику:

Відбувається ВСЕ ОДНО архівація!
Загальна: листи йдуть в архів. А архів з точки зору GMail — це листи, які не мають видимих ярликів і не побували в кошику.
З одного боку — нічого страшного. Зате листи завжди можна буде знайти через пошук.
А що якщо я не хочу так? Що мені тепер робити?
Як знайти і видалити всі повідомлення з архіву? Ось тут непоганий відповідь. Але я щось не ризикнув ось так видаляти все і відразу.
До речі, в рядку пошуку я так і не знайшов способу показати повідомлення, які мають тільки один конкретний ярлик. Тобто наприклад, я вирішив видалити всі повідомлення, які мають ярлик CATEGORY_PROMOTIONS і ніякий інший. Ці рекламні листи в архіві мені точно не потрібні. До речі, а скільки їх там?
GMailMessagesSize -mongoConnectionString 10.211.55.5 -showSizes -l CATEGORY_PROMOTIONS -onlyThisLabel
LabelId;Label name;Messages size;Messages count
CATEGORY_PROMOTIONS;CATEGORY_PROMOTIONS;1197364170;14618

У мене їх там на гігабайт накопичилося.
-onlyThisLabel важлива опція, яка як раз і дозволяє знайти тільки ті повідомлення, які мають цей єдиний ярлик.
GMailMessagesSize -mongoConnectionString 10.211.55.5 -showSizes -l CATEGORY_PROMOTIONS -l IMPORTANT -onlyThisLabel
LabelId;Label name;Messages size;Messages count
CATEGORY_PROMOTIONS;CATEGORY_PROMOTIONS;1197364170;14618

Та у мене ще на півтора гігабайти «важливих рекламних повідомлень :) Зверніть увагу, що це додаток до просто гігабайту неважливою реклами.
Руки відразу закортіло все це видалити!
GMailMessagesSize -mongoConnectionString 10.211.55.5 -deleteMessages -l CATEGORY_PROMOTIONS -l IMPORTANT -onlyThisLabel -procNum 10

Насправді листи не видаляються, а поміщаються в корзину. Там вони через 30 днів або зникнуть зовсім, або можна піти й вручну почистити самому.

РАЗОМ: Якщо ви видаляєте повідомлення не через Web-інтерфейс GMail, а через сторонній клієнт (можливо мобільний), то є ймовірність, що повідомлення не видаляються, а архівуються. Для деяких це навіть добре. А у кого-то це призводить до того, що скринька просто непристойно розпухає.
І справа навіть не в 2 баксах в місяць. Можна і 100 гигов з'їсти і далі більше. Хотілося саме розібратися в суті питання.

УВАГА!!! Проект писався особисто для себе. Це моя перша програма на Go. За збереження ваших листів я не відповідаю! Але якщо не користуватися опцією -deleteMessages, то нічого з вашим ящиком не трапиться.
Що зробити, щоб програма запрацювала?
  • Use this wizard to create or select a project in the Google Developers Console and automatically turn on the API. Click Continue, then Go to credentials.

  • At the top of the page, select the OAuth consent screen tab. Select an Email address, enter a Product name if not already set, and click Save the button.
  • Select the Credentials табуляції, click the Add credentials button and select OAuth 2.0 client ID.
  • Select the application type Other, enter the name «Gmail API Quickstart», and click the Create button.
  • Click OK to dismiss the resulting dialog.
  • Click the (Download JSON) button to the right of the client ID.
  • Move this file to your working directory and rename it client_secret.json.


Підкажіть, а для вас проблема з розміром скриньки GMail актуальна? Потрібно довести мою саморобку до розуму, щоб ви могли вибірково почистити свої архівні повідомлення?

/>
/>


<input type=«radio» id=«vv70355»
class=«radio js-field-data»
name=«variant[]»
value=«70355» />
Мені безкоштовних 15 гігабайт вистачить на два життя, т. до. мені приходить одне повідомлення в день
<input type=«radio» id=«vv70357»
class=«radio js-field-data»
name=«variant[]»
value=«70357» />
Я купив 30 терабайт у Google і розмір скриньки GMail мене не турбує
<input type=«radio» id=«vv70359»
class=«radio js-field-data»
name=«variant[]»
value=«70359» />
Я б поразбирался з тим, що і як у мене зберігається в скриньці GMail і зручний інструмент мені був би корисний
<input type=«radio» id=«vv70361»
class=«radio js-field-data»
name=«variant[]»
value=«70361» />
У мене немає аккаунта GMail

Проголосувало 154 людини. Утрималося 35 осіб.


Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.