web-dev-qa-db-fra.com

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

Vous pouvez accéder à Gmail à l'aide de l'interface Web, du client Google Android ou IMAP. Pour autant que je sache, l'interface Web et l'application Android utilise un protocole complètement différent d'IMAP - ce ne sont pas seulement des interfaces par-dessus. La raison pour laquelle je suis sûr est que l'application Android peut ouvrir sans problème un dossier contenant 1m de courrier en <3 secondes. Aucun client IMAP ordinaire ne peut le faire.

Donc ma question est ce que l'on sait de ce protocole secret? Où est la documentation de référence pour cela? A-t-il été rétroconçu? Google sanctionne-t-il son utilisation?

la réponse de arnt fournit une excellente méthode pour tester la vitesse d'imap brute 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ée, c SELECT "[Gmail]/All mail" prend environ 20 secondes pour terminer. Étant donné que ce temps est plus long qu'il n'en faut pour l'application GMail sur mon téléphone relativement sous-alimenté Android téléphone pour démarrer et charger l'étiquette All mail qui le fait en moins de 6 secondes même après avoir purgé ses caches. Le client Web est encore plus rapide.

À moins que je manque quelque chose de basique, cela prouve "hors de tout doute raisonnable" que les clients GMail de Google n'utilisent pas IMAP car vous n'avez jamais à attendre 20 secondes pour qu'une commande SELECT se termine.

19
Björn Lindqvist

Après plus de recherches, j'ai trouvé qu'il existe une API pour GMail: https://developers.google.com/gmail/api/ Je ne pense pas que l'API ait été publiée lorsque j'ai posté ce question en 2013.

En utilisant cette API, j'ai créé un programme de démonstration qui récupère les 100 derniers courriers d'une étiquette: https://Gist.github.com/bjourne/37a9d15b03862003008a1b0169190dbe

La partie pertinente 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 100 derniers messages triés par date dans une étiquette (dossier dans la terminologie IMAP) contenant plus de 570 000 messages.

Sur ma machine, cette boucle prend environ 0,5 à 0,8 seconde. Je peux affirmer avec confiance qu'aucun aucun client IMAP pur sur la planète ne s'en rapproche. Probablement, IMAP ne sera jamais plus rapide, car il ne correspond pas à la façon dont Google stocke le courrier en interne.

Je vais donc répondre à ma propre question. Il s'agit de l'API qu'ils utilisent et elle n'a pas été exposée plus tôt.

7
Björn Lindqvist

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

Quant à savoir pourquoi l'application Android est si rapide - ce que je sais, c'est qu'elle utilise la commande SEARCH pour sélectionner les messages n les plus récents. Les clients de bureau tels que Thunderbird ou Les perspectives sont beaucoup plus lourdes et téléchargent les en-têtes et les métadonnées pour chaque message dans le dossier, malgré les recommandations à ne pas le faire.

Un smartphone ne dispose pas des ressources nécessaires pour stocker et traiter des millions d'e-mails (bien que des messages plus modernes puissent y arriver), l'approche SEARCH a donc permis un accès rapide au courrier pour les appareils portables.

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

10
Gigi

Vous pouvez tester facilement les performances IMAP de gmail (si vous avez une boîte aux lettres d'un million 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 [email protected] yourpassword
b select inbox

Ou ouvrez votre boîte Allmail si la boîte de réception n'est pas assez grande (le nom peut varier selon la langue de l'interface utilisateur):

c select "[Gmail]/All Mail"

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

1
arnt

"Aucun autre client IMAP ne peut faire cela" est une déclaration assez audacieuse, mais un million de messages est également un chiffre assez important. Je vous encourage à essayer Trojitá ici. Il y a des chances que la synchronisation initiale soit plutôt lente (elle transfèrerait les indicateurs pour ce million de messages pour diverses raisons techniques liées à la façon dont les indicateurs IMAP, SELECT, SEARCH et STATUS sont spécifiés), mais la resynchronisation suivante devrait être rapide comme l'éclair grâce à ESEARCH, CONDSTORE et QRESYNC. Je serais intéressé de savoir dans quelle mesure Trojitá fonctionne avec votre configuration - les coordonnées sont sur la page d'accueil.

À votre question - la plupart des webmails fournissent aujourd'hui une API privée pour leur propre usage. Une architecture typique consiste à 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 propriétaire. 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 pour vérifier cela car il est probable que TLS soit utilisé. Avec une interface Web, il est trivial de voir le trafic avec un plugin de navigateur approprié, mais pas tant avec une application autonome Android application.

1
Jan Kundrát