谷歌对Gmail使用什么协议?(不是IMAP或POP)



您可以使用web界面、谷歌的Android客户端或IMAP访问gmail。据我所知,网络接口和安卓应用程序使用了与IMAP完全不同的协议——它们不仅仅是它上面的接口。我确信这一点的原因是,安卓应用可以毫无问题地打开一个包含100万邮件的文件夹<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秒才能完成。由于这段时间比我相对动力不足的安卓手机上的GMail应用程序启动和加载All mail标签所需的时间要长,即使在我清除了它的缓存后,它也能在不到6秒内完成。网络客户端甚至更快。

除非我遗漏了一些基本的东西,否则这"毫无疑问"地证明了谷歌的GMail客户端不使用IMAP,因为你永远不需要等待20秒才能完成任何SELECT命令。

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

至于为什么Android应用程序如此快速,我所知道的是它使用SEARCH命令来选择最新的n消息。Thunderbird或Outlook等桌面客户端的重量要大得多,并且会为文件夹中的每封邮件下载标题和元数据,尽管建议它们不要这样做。

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

无论如何,Wireshark可以揭示IMAP客户端和服务器的大量行为。如果你真的很好奇,试试看。如果服务器是Gmail,你不能这样做,但你可以在另一台服务器(例如hMailServer)上尝试。

经过更多的研究,我发现GMail有一个API: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))

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

在我的机器上,这个循环大约需要0.5-0.8秒。我可以自信地宣称,这个星球上没有一个纯粹的IMAP客户端能做到这一点。IMAP可能永远不会变得更快,因为它不适合谷歌内部存储邮件的方式。

所以我会回答我自己的问题。这是他们正在使用的API,之前没有公开。

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

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

然后登录并打开收件箱。

a login yourname@gmail.com yourpassword
b select inbox

如果收件箱不够大,也可以打开你的全邮箱(名称可能因用户界面语言而异):

c select "[Gmail]/All Mail"

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

"没有其他IMAP客户端可以做到这一点"是一句相当大胆的话,但一百万条消息也是一个相当大的数字。我鼓励你在这里试试Trojitá。最初的同步可能会相当慢(由于与IMAP标志SELECTSEARCHSTATUS的指定方式有关的各种技术原因,它会传输数百万条消息的标志),但由于ESEARCHCONDSTOREQRESYNC,后续的重新同步应该会非常快。我很想知道Trojitá与您的设置配合得有多好——联系信息在主页上。

对于你的问题——现在大多数电子邮件都提供了一个私有的API供自己使用。一个典型的体系结构是通过JSON传输关于更新状态的消息,但没有标准,接口是优先的。GMail"应用程序"可能使用相同(或类似)的方法。您没有太多的选项来验证这一点,因为它可能使用TLS。使用web界面,使用适当的浏览器插件查看流量是很简单的,但使用独立的Android应用程序就不那么简单了。

最新更新