POP3 サーバーでの新規メールメッセージの検出

POP3 アカウントでは、ダウンロードや閲覧時にメッセージをサーバーに残すことができます。サーバーにメールを残すことで、複数のデバイスからメールにアクセスするユーザーなど、他のアプリケーションや個人がそのメールを利用できるようになります。また、特定の件名など、特別な条件を満たすメッセージだけをダウンロードしたい場合にも対応できます。メールを管理するには、次のことができます;

  • Aspose.Email を使用して POP3 メールサーバーからすべてのメッセージを読み取る。
  • メッセージをローカルデータベースにダウンロードする。

メッセージは削除されずサーバーに残ります。最初に実行したときはこのプロセスは正常に動作し、必要なメッセージはすべてデータベースにダウンロードされます。しかし2回目に実行すると、メールサーバー上にまだ存在するため同じメッセージが再びダウンロードされ、重複レコードが発生します。この問題を解決するには、 Pop3MessageInfo.UniqueID メッセージが既にダウンロードされているかどうかを確認するプロパティ。メッセージのユニーク ID はデータベースに保存する必要があります。これは新規メッセージ検出の検索キーとなります。

新規メッセージの検出

POP3 サーバー上のメールリストから新規メールを特定するには:

  1. サーバーに接続する。
  2. メールのリストを取得する。
  3. データベースに接続する。
  4. メールのリストを取得する。
  5. リストを比較する。
  6. 新規メールをデータベースに保存する。

以下の場合、プロセスが高速になります:

  1. すべてのメッセージのユニーク ID をハッシュテーブルに取得する。
  2. for(…) ループ内で各メールメッセージごとにデータベースではなくハッシュテーブルを検索する。

各メッセージごとにデータベースを照会し多数のデータベース呼び出しが必要になる代わりに、このメソッドは1回の呼び出しだけで済みます。以下のコードスニペットは、POP3 サーバーで新規メールメッセージを検出する方法を示しています。

public static void run() {
    try {
        // Connect to the POP3 mail server and check messages.
        Pop3Client pop3Client = new Pop3Client("pop.domain.com", 993, "username", "password");

        // List all the messages
        Pop3MessageInfoCollection msgList = pop3Client.listMessages();
        for (Pop3MessageInfo msgInfo : msgList) {
            // Get the POP3 message's unique ID
            String strUniqueID = msgInfo.getUniqueId();

            // Search your local database or data store on the unique ID. If a match is found, that means it's already downloaded. Otherwise download and save it.
            if (searchPop3MsgInLocalDB(strUniqueID) == true) {
                // The message is already in the database. Nothing to do with this message. Go to next message.
            } else {
                // Save the message
                savePop3MsgInLocalDB(msgInfo);
            }
        }
    } catch (Exception ex) {
        System.err.println(ex);
    }

}

private static void savePop3MsgInLocalDB(Pop3MessageInfo msgInfo) {
    // Open the database connection according to your database. Use public properties (for example msgInfo.Subject) and store in database,
    // for example, " INSERT INTO POP3Mails (UniqueID, Subject) VALUES ('" + msgInfo.UniqueID + "' , '" + msgInfo.Subject + "') and Run the query to store in database.
}

private static boolean searchPop3MsgInLocalDB(String strUniqueID) {
    // Open the database connection according to your database. Use strUniqueID in the search query to find existing records,
    // for example, " SELECT COUNT(*) FROM POP3Mails WHERE UniqueID = '" + strUniqueID + "' Run the query, return true if count == 1. Return false if count == 0.
    return false;
}