POP3 サーバーからメールを取得するアプリを作成しようとしています。私が最終的に使用した「戦略」は次のとおりです。
- 単一のメッセージを取得する
- メッセージがデータベースに既に存在するかどうかを確認します
- そうでない場合は、挿入し、1 に移動します
これが完璧ではないことはわかっていますが、わかりました...すぐに問題に直面しましょう:)
醜いスタイルをお詫び申し上げます。私はアセンブリおよび純粋な C プログラマーとして十分に訓練されており、Java を使い始めたばかりです。単一のメッセージを取得するコードは次のとおりです (より読みやすくするために、try/catch ステートメントをカットしました)。
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
Store store = null;
POP3Folder folder = null;
openStaffLabel: {
store = session.getStore(exXContainer.accounts[selectedAccount].accountType.toLowerCase());
store.connect(host, username, password);
folder =(POP3Folder) store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
int countMsg = 0;
countMsg = folder.getMessageCount();
if (countMsg == 0)
break openStaffLabel;
message = folder.getMessages(countMsg - first + 1);
for(int i = 0;i < messages.length;i++)
{
// do some stuffs with messages
}
} // openStaffLabel:
folder.close(false);
store.close();
それはうまくいくようです。その後、私はインターネット上でこのコード ( here ) を見つけました。これは、ポスターによってはるかに効率的であると主張されています。
URLName url = new URLName("pop3", host, 110, "", user, password);
Session session = Session.getDefaultInstance(System.getProperties(),null);
Store store = session.getStore(url);
store.connect();
POP3Folder inbox = (POP3Folder)store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
FetchProfile profile = new FetchProfile();
profile.add(UIDFolder.FetchProfileItem.UID);
Message[] messages = inbox.getMessages();
inbox.fetch(messages,profile);
for(int i = 0;i < messages.length;i++)
{
// do some stuffs with messages
}
著者は次のように主張しています。「前のシナリオとの主な違いは、クライアントが新しいメールのみをダウンロードすることです」
しかし、彼のコードには inbox.getMessages() があり、私がよく理解していれば、実際にすべてのメッセージをダウンロードします。ポイントは... getMessages を使用してすべてのヘッダーを既にフェッチしている場合、 fetch(messages,profile) を使用する本当の利点は何ですか? UID のみをダウンロードしたい場合、どうすればよいですか?
さらに、最初の N メールの UID のみをダウンロードしたい場合は...可能ですか?
助けてくれる人に感謝します。私はこの問題に1週間立ち往生しています。クリスティアーノ