Quel protocole Google utilise-t-il pour Gmail? (pas IMAP ou POP)

vous pouvez accéder à gmail soit en utilisant l'interface web, le client Android de Google ou en utilisant IMAP. Pour autant que je puisse dire, l'interface web et L'application Android utilisent un protocole complètement différent de IMAP -- ils ne sont pas seulement des interfaces sur le dessus de lui. La raison pour laquelle je suis sûr de cela est parce que L'application Android peut sans problème ouvrir un dossier avec 1m mail en moins de 3 secondes. Aucun client IMAP ne peut faire ça.

ma question est donc: que sait-on de ce protocole secret? Où est la documentation de référence? Il a été à l'ingénierie inverse? Google autorise-t-il son utilisation?

la réponse d'arnt fournit une excellente méthode pour tester la vitesse brute imap de 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)

La commande que j'ai marqué, c SELECT "[Gmail]/All mail" a propos 20 secondes pour terminer. Depuis ce temps est plus grand que ce qu'il faut pour L'application GMail sur mon téléphone Android relativement faible pour démarrer et charger l'étiquette All mail qui le fait en moins de 6 secondes, même après que j'ai purgé ses caches. Le client web est encore plus rapide.

à moins que je ne manque quelque chose de Basique cela prouve "au-delà de tout doute raisonnable" que les clients GMail de Google n'utilisent pas IMAP depuis que vous n'avez jamais à attendre 20 secondes pour toute commande SELECT à compléter.

14
demandé sur Björn Lindqvist 2013-09-01 02:37:55

4 réponses

L'application Android (au moins celles que j'ai utilisées) utilise IMAP. Vous pouvez vérifier cela en exécutant Wireshark sur le serveur.

en ce qui concerne la raison pour laquelle L'application Android est si rapide - ce que je sais c'est qu'elle utilise la commande SEARCH pour sélectionner le plus récent n messages. Les clients de bureau tels que Thunderbird ou Outlook sont beaucoup plus lourds et téléchargent des en-têtes et des métadonnées pour chaque message dans le dossier, malgré des recommandations pour eux de ne pas le faire.

un smartphone ne avoir les ressources pour stocker et traiter des millions d'e-mails (bien que les plus modernes pourraient y arriver) de sorte que l'approche de recherche a permis un accès rapide au courrier pour les appareils portatifs.

quoi qu'il en soit, Wireshark peut révéler beaucoup de choses sur le comportement des clients et des serveurs IMAP. Si vous êtes vraiment curieux, tentez votre chance. Vous ne pouvez pas faire cela si le serveur est Gmail, mais vous pouvez l'essayer sur un autre serveur (par exemple hMailServer).

9
répondu Gigi 2013-09-05 14:50:30

après plus de recherches, j'ai découvert qu'il existe une API pour GMail:https://developers.google.com/gmail/api/ Je ne pense pas que L'API a été publié lorsque j'ai posté cette question en 2013.

en utilisant cette API, j'ai créé un programme de démo qui récupère les 100 derniers mails d'un label:https://gist.github.com/bjourne/37a9d15b03862003008a1b0169190dbe

La partie correspondante du programme est:

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))

Il répertorie les les 100 derniers messages Classés par date dans une étiquette (dossier en terminologie IMAP) contenant plus de 570 K messages.

Sur ma machine, cette boucle prend environ 0,5 - 0,8 secondes. Je peux réclamer de confiance, qu' pas de pure client IMAP sur la planète est encore proche. Probablement, IMAP ne sera jamais plus rapide parce que C'est un mauvais ajustement pour la façon dont Google stocke le courrier interne.

alors je vais répondre à ma propre question. C'est L'API qu'ils utilisent et elle n'a pas été exposée plus tôt.

7
répondu Björn Lindqvist 2016-10-16 19:52:11

"aucun autre client IMAP ne peut faire cela" est un énoncé assez audacieux, mais un million de messages est aussi un nombre assez important. Je vous encourage à donner Trojitá un essai ici. Il est probable que la synchronisation initiale sera plutôt lente (elle transférerait les drapeaux pour ce million de messages pour diverses raisons techniques liées à la façon dont les drapeaux IMAP, SELECT,SEARCH et STATUS sont spécifiés), mais la resynchronisationsuivante devrait être rapide par la foudre merci ESEARCH,CONDSTORE et QRESYNC. Je serais intéressé d'entendre comment Trojitá fonctionne avec votre installation -- les informations de contact sont sur la page d'accueil.

a votre question -- la plupart des webmails fournissent aujourd'hui une API privée pour leur propre usage. Une architecture typique est de transférer des messages sur l'état mis à jour via JSON, mais il n'y a pas de norme pour cela et l'interface est prioprietary. Il est probable que L'application GMail utilise la même méthode (ou une méthode similaire). Vous n'avez pas beaucoup d'options à vérifiez ceci car il est probable qu'il utilise TLS. Avec une interface web, il est trivial de voir le trafic avec un plugin de navigateur approprié, mais pas tellement avec une application Android autonome.

1
répondu Jan Kundrát 2013-09-02 11:44:34

vous pouvez tester facilement les performances IMAP de gmail (si vous avez une boîte aux lettres de millions de messages). Ouvrez une connexion IMAP avec

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

puis connectez-vous et ouvrez votre boîte de réception.

a login yourname@gmail.com yourpassword
b select inbox

Ou ouvrir votre allmail case si la boîte de réception n'est pas assez grand (le nom peut varier en fonction de la langue de l'INTERFACE utilisateur):

c select "[Gmail]/All Mail"

Si SELECT est rapide mais un client IMAP lent, alors c'est parce que le client envoie des commandes supplémentaires/non nécessaires. Beaucoup choisissent de remplir ou mettre à jour une structure de données pour le million de messages, même s'ils n'en affichent que 40. C'est le choix du client, pas la lenteur IMAP.

1
répondu arnt 2015-12-15 14:42:41