1

POP3 サーバーからメールを取得するアプリを作成しようとしています。私が最終的に使用した「戦略」は次のとおりです。

  1. 単一のメッセージを取得する
  2. メッセージがデータベースに既に存在するかどうかを確認します
  3. そうでない場合は、挿入し、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週間立ち往生しています。クリスティアーノ

4

1 に答える 1

1

POP3 はこれに最適なプロトコルではありません。POP3 プロトコルで何ができるかを理解すれば、このことをよりよく理解できます。

説明した fetch メソッドを使用すると、メールボックス内のすべてのメッセージのすべての UID が 1 回の操作で取得されます。確認した UID を追跡しておくと、確認していないメッセージのコンテンツのみを取得することができます。すべてのメッセージのループで POP3Folder.getUID メソッドを使用して、既に見たメッセージをスキップします。getMessage メソッドは実際にはメッセージの内容をフェッチしないことに注意してください。コンテンツにアクセスする別の方法を使用するまで、コンテンツは取得されません。

POP3 プロトコルでは、1 つのメッセージの UID、またはすべてのメッセージの UID しか取得できないことに注意してください。

com.sun.mail.pop3 パッケージの javadoc とJavaMail FAQ 、特によくある間違いに関するこの項目を必ずお読みください。

于 2013-05-24T04:30:40.793 に答える