Подтвердить что ты не робот

Какой протокол использует Google для Gmail? (не IMAP или POP)

Вы можете получить доступ к gmail, используя веб-интерфейс, клиент Google Android или используя IMAP. Насколько я могу судить, веб-интерфейс и приложение для Android используют совершенно другой протокол, чем IMAP - это не просто интерфейсы поверх него. Причина, по которой я уверен, заключается в том, что приложение Android может без проблем открыть папку с 1 м письмом в < 3 секунды. Ни один простой клиент IMAP не может этого сделать.

Итак, мой вопрос в том, что известно об этом секретном протоколе? Где эта справочная документация? Было ли это обратное проектирование? Google санкционирует его использование?

Ответ arnt обеспечивает превосходный метод проверки сырой скорости imap gmail:

$ openssl s_client -host imap.gmail.com -port 993 -crlf 
...
* OK Gimap ready for requests from 12.34.56.78
$ a LOGIN ***@*** ***
a OK
$ c SELECT "[Gmail]/All mail" !!!!
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)] Flags permitted.
* OK [UIDVALIDITY 673376278] UIDs valid.
* 1142417 EXISTS
* 0 RECENT
* OK [UIDNEXT 1159771] Predicted next UID.
* OK [HIGHESTMODSEQ 8670601]
c OK [READ-WRITE] [Gmail]/All mail selected. (Success)

Команда, отмеченная мной, c SELECT "[Gmail]/All mail" занимает около 20 секунд. С тех пор это больше, чем требуется для приложения GMail на моем относительно ненадежном телефоне Android для запуска и загрузки метки All mail, которая делает это менее чем за 6 секунд, даже после того, как я очистил свои кеши. Веб-клиент еще быстрее.

Если я не пропущу что-то основное, это доказывает "вне разумных сомнений", что клиенты Google GMail не используют IMAP, так как вам никогда не придется ждать 20 секунд для завершения любой команды SELECT.

4b9b3361

Ответ 1

После дополнительных исследований я обнаружил, что существует API для GMail: https://developers.google.com/gmail/api/ Я не думаю, что API был выпущен когда я разместил этот вопрос еще в 2013 году.

Используя этот API, я создал демонстрационную программу, которая извлекает 100 последних писем метки: https://gist.github.com/bjourne/37a9d15b03862003008a1b0169190dbe

Соответствующая часть программы:

resource = service.users().messages()
result = resource.list(userId = 'me', labelIds = [label]).execute()
mail_ids = [m['id'] for m in result['messages']]

start = time()
mails = []
batch = BatchHttpRequest()
cb = lambda req, res, exc: mails.append(to_mail(res))
for mail_id in mail_ids:
    get_request = resource.get(**headers_params(mail_id))
    batch.add(get_request, callback = cb)
result = batch.execute()
print('Took %.2f seconds' % (time() - start))

В нем перечислены последние 100 сообщений, отсортированные по дате в метке (папка в терминологии IMAP), содержащей более 570 тыс. сообщений.

На моей машине этот цикл занимает около 0,5 - 0,8 секунды. Я могу с уверенностью утверждать, что чистый клиент IMAP на планете близок. Вероятно, IMAP никогда не будет быстрее, потому что он плохо подходит для того, как Google хранит почту внутри страны.

Поэтому я отвечу на свой вопрос. Это API, который они используют, и он не был показан ранее.

Ответ 2

Приложение Android (по крайней мере, те, что я использовал) использует IMAP. Вы можете проверить это, запустив Wireshark на сервере.

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

Смартфон не располагает ресурсами для хранения и обработки миллионов писем (хотя там могут быть и более современные), поэтому подход ПОИСК допускал быстрый доступ к почте для карманных устройств.

В любом случае Wireshark может многое рассказать о поведении клиентов и серверов IMAP. Если вам действительно интересно, сделайте снимок. Вы не можете сделать это, если сервер Gmail, но вы можете попробовать его на другом сервере (например, hMailServer).

Ответ 3

"Никакой другой клиент IMAP не может этого сделать" - довольно смелое утверждение, но миллион сообщений также довольно большой. Я бы посоветовал вам дать Trojitá попробовать здесь. Скорее всего, первоначальная синхронизация будет довольно медленной (она будет передавать флаги для этого миллиона сообщений по различным техническим причинам, связанным с тем, как указаны флаги IMAP, SELECT, SEARCH и STATUS), но последующие resynchronizaiton должен быть молниеносным благодаря ESEARCH, CONDSTORE и QRESYNC. Мне было бы интересно узнать, насколько хорошо Trojitá работает с вашей настройкой - контактная информация находится на главной странице.

На ваш вопрос - большинство веб-сайтов в настоящее время предоставляют частный API для собственного использования. Типичной архитектурой является передача сообщений об обновленном состоянии через JSON, но для этого нет стандарта, и интерфейс является prioprietary. Скорее всего, приложение GMail использует тот же (или аналогичный) метод. У вас мало возможностей проверить это, так как это, скорее всего, использует TLS. С веб-интерфейсом тривиально видеть трафик с соответствующим плагином браузера, но не столько с автономным приложением Android.

Ответ 4

Вы можете легко протестировать производительность IMAP gmail (если у вас есть почтовый ящик из миллиона сообщений). Откройте соединение IMAP с помощью

openssl s_client -connect imap.gmail.com:993 -crlf

затем войдите в систему и откройте свой почтовый ящик.

a login [email protected] yourpassword
b select inbox

Или откройте поле allmail, если папка "Входящие" недостаточно велика (имя может меняться в зависимости от языка пользовательского интерфейса):

c select "[Gmail]/All Mail"

Если SELECT работает быстро, но IMAP-клиент медленный, то это потому, что клиент отправляет дополнительные/ненужные медленные команды. Многие предпочитают заполнять или обновлять структуру данных для всего миллиона сообщений, даже если они собираются отображать только 40 сообщений. Этот выбор клиента, а не медленность IMAP.