25

您可以使用 Web 界面、Google 的 Android 客户端或使用 IMAP 访问 gmail。据我所知,Web 界面和 Android 应用程序使用与 IMAP 完全不同的协议——它们不仅仅是基于它的界面。我确定这一点的原因是因为 Android 应用程序可以在 < 3 秒内毫无问题地打开一个包含 1m 邮件的文件夹。没有普通的 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 秒的时间内完成它。Web 客户端甚至更快。

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

4

4 回答 4

11

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

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

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

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

于 2013-09-05T14:50:30.997 回答
11

经过更多研究,我发现存在一个用于 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,之前没有公开。

于 2016-10-16T19:52:11.703 回答
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 缓慢。

于 2013-12-15T10:36:59.853 回答
1

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

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

于 2013-09-02T11:44:34.677 回答