最近アクティブな上位 X 件の Gmail スレッドのリストを取得する最適な方法を探しています。
バックグラウンド:
Java を使用して、Google Apps for Education ドメインで OAuth を使用して IMAP にアクセスしています。未読メッセージを含む最新の20 スレッドを一覧表示できるGmail Atom 受信トレイ フィードが利用可能です。このフィードへのアクセスは、私が OAuth/IMAP を使用して作成したものよりもはるかに高速です。
Gmail Atom 受信トレイ フィードよりも IMAP アプローチを使用する利点は、IMAP を使用すると、任意の数のメッセージ (20 だけでなく) にアクセスし、メッセージを読んだり、スレッド サイズを取得したり、関連する Google ラベルを取得したり、クォータの詳細を取得したり、チェックしたりできることです。フラグ。基本的に、これにより、ユーザーはより Gmail に似たエクスペリエンスを得ることができます (ポータルには読み取り専用のエクスペリエンスのみが必要です)。私の問題は、IMAP アクセスが Atom フィードよりも大幅に遅いことです。比較すると、IMAP メソッドは約 10 秒かかりますが、Atom フィードは通常 2 秒以内に返されます。
Gmail のIMAP 拡張機能とGmail の高度な検索構文を認識しており、使用しています。
現在の方法:
IMAP 受信トレイから上位 40 のスレッドが必要だと想像してください。現在、任意の数のメッセージ (40 * 4) をダウンロードし、X-GM-THRIDのみを取得しています。受信トレイ メッセージのリストを使い果たすか、目標のスレッド数に達するまで、スレッド ID を格納するこれらのメッセージを反復処理します (必要に応じてさらにメッセージをフェッチします)。
次に、IMAP 検索を実行するために使用できる Gmail スレッド ID のリストを取得します (必要なメッセージの詳細に応じて、適切な FetchProfile.Item を使用します)。
検索結果を繰り返し処理して、次のようなものを生成します (すばらしいGoogle Guava/Google Collections Multimap を使用):
Multimap<Long, Message> threadMultiMap = LinkedListMultimap.create();
これは次のように簡単にマッサージできます。
LinkedHashMap<Long, Message[]> threadMap;
X 個の異なるメッセージ スレッドが識別されるまで、INBOX を反復処理するよりも良い方法はありますか?