Google使用什么协议用于Gmail? (不是IMAP或POP)

时间:2013-08-31 22:37:56

标签: gmail protocols imap gmail-imap

您可以使用网络界面,Google的Android客户端或使用IMAP访问Gmail。据我所知,网络界面和Android应用程序使用的协议与IMAP完全不同 - 它们不仅仅是接口。我之所以确定这是因为Android应用程序可以毫无问题地打开一个包含1m邮件的文件夹< 3秒。没有普通的IMAP客户端可以做到这一点。

所以我的问题是这个秘密协议的知识是什么?它的参考文档在哪里?是否进行了逆向工程?谷歌是否会批准其使用?

arnt的回答提供了一种测试gmail原始imap速度的绝佳方法:

$ 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秒才能完成。由于那个时间比我相对功能不足的Android手机上的GMail应用程序启动和加载所有邮件标签所花费的时间更长,即使在我清除其缓存后也不到6秒。网络客户端甚至更快。

除非我遗漏了一些基本信息,否则“无可置疑地”证明Google的GMail客户端不使用IMAP,因为您永远不需要等待20秒才能完成任何SELECT命令。

4 个答案:

答案 0 :(得分:10)

Android应用程序(至少是我使用的应用程序)使用IMAP。您可以通过在服务器上运行Wireshark来验证这一点。

至于为什么Android应用程序如此之快 - 我所知道的是它使用SEARCH命令来选择最新的 n 消息。桌面客户端(如Thunderbird或Outlook)的重量更轻,下载文件夹中每条消息的标题和元数据,尽管建议他们不要这样做。

智能手机没有足够的资源来存储和处理数百万封电子邮件(尽管更多现代电子邮件可能会到达),因此SEARCH方法允许手持设备快速访问邮件。

无论如何,Wireshark可以揭示有关IMAP客户端和服务器行为的大量信息。如果你真的很好奇,那就试一试吧。如果服务器是Gmail,则无法执行此操作,但您可以在其他服务器(例如hMailServer)上进行试用。

答案 1 :(得分:7)

经过更多研究后,我发现GMail存在一个API:https://developers.google.com/gmail/api/我不认为在2013年发布此问题时API已发布。

使用该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))

它列出了包含超过570k条消息的标签(IMAP术语中的文件夹)中按日期排序的最后100条消息。

在我的机器上,此循环大约需要0.5 - 0.8秒。我可以自信地声称地球上没有纯粹的IMAP客户端甚至接近。可能,IMAP不会变得更快,因为它不适合Google内部存储邮件的方式。

所以我会回答我自己的问题。这是他们正在使用的API,并且它没有被更早地暴露。

答案 2 :(得分:1)

“没有其他IMAP客户端可以做到这一点”是一个非常大胆的声明,但是数百万条消息也是一个相当大的数字。我鼓励你在这里试试Trojitá。有可能初始同步将相当缓慢(由于与IMAP标志SELECTSEARCHSTATUS如何相关的各种技术原因,它会传输数百万条消息的标记由于ESEARCHCONDSTOREQRESYNC,后续的重新同步应该是闪电般快速的。我很想知道Trojitá如何与您的设置配合使用 - 联系信息在主页上。

对于您的问题 - 现在大多数网络邮件都提供了一个供自己使用的私有API。典型的体系结构是通过JSON传输有关更新状态的消息,但是没有标准,接口是专有的。有可能GMail“app”使用相同(或类似)的方法。您没有太多选项可以验证这一点,因为它可能使用TLS。使用Web界面,使用适当的浏览器插件查看流量是微不足道的,但使用独立的Android应用程序则不是很多。

答案 3 :(得分:1)

您可以轻松测试gmail的IMAP性能(如果您有一个百万邮件邮箱)。使用

打开IMAP连接
openssl s_client -connect imap.gmail.com:993 -crlf

然后登录并打开收件箱。

a login yourname@gmail.com yourpassword
b select inbox

如果收件箱不够大(或者名称可能因UI语言而异),请打开您的邮箱:

c select "[Gmail]/All Mail"

如果SELECT速度很快但IMAP客户端速度很慢,那么这是因为客户端发送了额外的/不需要的慢速命令。许多人选择填写或更新整个百万条消息的数据结构,即使它们只显示40条消息。这是客户的选择,而不是IMAP的缓慢。