Google 对 Gmail 使用啥协议? (不是 IMAP 或 POP)

Posted

技术标签:

【中文标题】Google 对 Gmail 使用啥协议? (不是 IMAP 或 POP)【英文标题】:What protocol does Google use for Gmail? (not IMAP or POP)Google 对 Gmail 使用什么协议? (不是 IMAP 或 POP) 【发布时间】:2013-09-04 09:30:18 【问题描述】:

您可以使用网络界面、Google 的 android 客户端或使用 IMAP 访问 gmail。据我所知,Web 界面和 Android 应用程序使用与 IMAP 完全不同的协议——它们不仅仅是基于它的界面。我确定这一点的原因是因为 Android 应用程序可以在

所以我的问题是关于这个秘密协议的已知信息是什么?它的参考文档在哪里?是否进行了逆向工程? Google 是否批准使用它?

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 秒的时间内完成它。 Web 客户端速度更快。

除非我遗漏了一些基本的东西,否则这证明“毫无疑问”Google 的 GMail 客户端不使用 IMAP,因为您永远不必等待 20 秒来完成任何 SELECT 命令。

【问题讨论】:

你确定不是 imap。 Imap 无需下载所有电子邮件即可打开文件夹。因此,它可以下载前 10 封电子邮件的一些信息,并在后台继续下载其余信息。 是的。大型邮箱的 IMAP 性能会降低。 Gmail 可以在不到 3 秒的时间内显示包含 100 万封邮件的邮箱中最近的 50 个线程。没有其他 IMAP 客户端可以做到这一点。 Gmail 中有更多非 imapness 的迹象,但这不适合这个问题。 我相信您有两个选择可以解决这个问题 - 拆卸他们的客户端或配置设备以通过您计算机上的 WiFi 并检查目标端口是什么。 我认为 Gmail 应用程序没有使用 POP 或 IMAP,因为我禁用了两者,我的 Android 手机仍然可以接收电子邮件。 稍后:一个 gmail 的 rest api 已经公开:developers.google.com/gmail/api 【参考方案1】:

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

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

【讨论】:

感谢您的建议。 Trojita 无论如何都不慢(实际上与其他一些客户端相比非常快),但它的速度与 gmail 的本地客户端相差甚远。【参考方案2】:

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

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

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

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

【讨论】:

我说的Android应用是:play.google.com/store/apps/details?id=com.google.android.gm你怎么知道它使用IMAP?同样 afaik,IMAP 中无法将搜索限制为仅 n 个最近的消息。如果您不知道,请提供参考。所以这不是gmail速度快的原因。 我知道是因为我广泛使用 IMAP - 正如我所说,如果您连接到服务器并在该服务器上运行 Wireshark,您会看到消息通过。正如我所说,您可以通过使用 SEARCH 命令获得一组最近的消息。如果我没记错的话,Android 邮件客户端将 SEARCH 与日期条件结合使用,因此它们会收到最近两周的邮件。再次强调,理解这一点的最佳方式是在 Wireshark 中亲自查看。 如果客户端关注EXISTS消息,它可以搜索最近的n条消息。如果服务器的最后一个 EXISTS 是 50000,则 'x UID SEARCH 49000:* SUBJECT sex' 在最近的一千个中搜索关于性的消息。 还有更多方法可以搜索最近的消息。 modseq 可能是我在 gmail 中使用的。或日期条款。 我不记得确切的命令,但 AFAIK Android 使用 SEARCH,它结合了日期(过去 2 周)和序列号。智能手机的功能相对有限,因此它们通常会检索最近 25 或 50 条消息之类的信息,然后在您明确请求更多信息时获取其余信息。【参考方案3】:

您可以轻松测试 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 的缓慢性。

【讨论】:

【参考方案4】:

经过更多研究,我发现存在一个用于 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))

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

在我的机器上,这个循环大约需要 0.5 - 0.8 秒。我可以自信地宣称,地球上没有任何纯 IMAP 客户端能与之媲美。很可能,IMAP 永远不会变得更快,因为它不适合 Google 在内部存储邮件的方式。

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

【讨论】:

这里真正需要时间的工作是MSN维护。当您访问一条消息时,谷歌的服务器会告诉您当前邮箱中的消息编号为 569901。这是大多数 IMAP 客户端丢弃的信息。

以上是关于Google 对 Gmail 使用啥协议? (不是 IMAP 或 POP)的主要内容,如果未能解决你的问题,请参考以下文章

使用 gmail 服务器使用 XMPP 协议的聊天应用程序

在一个应用程序中同时使用 Gdata 和 Xmpp 协议

这个 API 使用啥 OAuth 协议,是不是有一个标准的 OAuth 库可以用来对其进行身份验证?

iOS 上的 GMail 应用程序使用啥来编辑 HTML 电子邮件?

Google Goggles 和 Layar 使用啥应用层协议?

使用 Gmail API 发送大附件