web-dev-qa-db-ja.com

GoogleではGmailにどのプロトコルを使用していますか? (IMAPまたはPOPではありません)

ウェブインターフェース、GoogleのAndroidクライアントまたはIMAPを使用してGmailにアクセスできます。私の知る限り、ウェブインターフェースとAndroidアプリが使用しますIMAPとは完全に異なるプロトコル-それらはその上の単なるインターフェースではありません。Androidアプリは問題なく1mのメールを含むフォルダーを開くことができるためです3秒未満。単純なIMAPクライアントはそれを行うことができません。

だから私の質問は、この秘密のプロトコルについて何が知られているのですか?参照ドキュメントはどこにありますか?それはリバースエンジニアリングされましたか? 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クライアントはさらに高速です。

基本的なものがない場合を除いて、SELECTコマンドが完了するまで20秒待つ必要がないため、GoogleのGMailクライアントがIMAPを使用しないことが「合理的な疑いを超えて」証明されます。

19

さらに調査したところ、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であり、以前は公開されていませんでした。

7

Androidアプリ(少なくとも私が使用したもの)はIMAPを使用しています。これは、サーバーでWiresharkを実行することで確認できます。

Androidアプリがとても速い-私が知っていることは、それがSEARCHコマンドを使用して最新のnメッセージを選択することです。ThunderbirdやOutlookの方がはるかに重いので、推奨されていませんが、フォルダー内のすべてのメッセージのヘッダーとメタデータをダウンロードします。

スマートフォンには何百万もの電子メールを保存および処理するためのリソースがないため(より新しいものが届く可能性がありますが)、SEARCHアプローチにより、ハンドヘルドデバイスへの迅速なメールアクセスが可能になりました。

とにかく、WiresharkはIMAPクライアントとサーバーの動作について多くのことを明らかにできます。本当に興味があるなら、試してみてください。サーバーがGmailの場合はこれを行うことはできませんが、別のサーバー(hMailServerなど)で試すことができます。

10
Gigi

GmailのIMAPパフォーマンスを簡単にテストできます(100万メッセージのメールボックスがある場合)。 IMAP接続を開く

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

次に、ログインして受信トレイを開きます。

a login [email protected] yourpassword
b select inbox

または、受信トレイが十分に大きくない場合は、allmailボックスを開きます(名前はUI言語によって異なる場合があります)。

c select "[Gmail]/All Mail"

SELECTは速いがIMAPクライアントが遅い場合、それはクライアントが追加の/不要な遅いコマンドを送信するためです。多くの人は、40メッセージしか表示しない場合でも、100万メッセージ全体のデータ構造を入力または更新することを選択します。これはクライアントの選択であり、IMAPの速度低下ではありません。

1
arnt

「他のIMAPクライアントがこれを行うことはできません」というのはかなり大胆な発言ですが、100万のメッセージもかなり大きな数字です。 Trojitá をここで試してみることをお勧めします。最初の同期がかなり遅くなる可能性があります(IMAPフラグ、SELECTSEARCHおよびSTATUSが指定されています)が、その後の再同期はESEARCHCONDSTOREおよびQRESYNCのおかげで非常に高速になります。 Trojitáがあなたの設定でうまく機能することを知りたいです-連絡先情報はホームページにあります。

あなたの質問に-ほとんどのウェブメールは今日、自分用のプライベートAPIを提供しています。典型的なアーキテクチャは、更新された状態に関するメッセージをJSON経由で転送することですが、これに関する標準はなく、インターフェースは独自のものです。おそらく、GMailの「アプリ」は同じ(または類似の)メソッドを使用しています。 TLSを使用している可能性が高いため、これを確認するためのオプションは多くありません。 Webインターフェイスでは、適切なブラウザープラグインでトラフィックを確認するのは簡単ですが、スタンドアロンのAndroidアプリケーションではそれほどではありません。

1
Jan Kundrát