Обнаружение новых электронных сообщений на POP3 сервере

С помощью аккаунтов POP3 вы можете оставлять сообщения на сервере при их загрузке и чтении. Оставляя электронные письма на сервере, вы позволяете другим приложениям и пользователям, например, пользователям, получающим доступ к своей электронной почте с нескольких устройств, работать с ними. Либо вы можете захотеть загружать только сообщения, которые соответствуют определенным критериям, например, сообщения с определенной темой. Для управления электронной почтой вы можете;

  • Читать все сообщения с POP3 почтового сервера с помощью Aspose.Email.
  • Загружать сообщения в вашу локальную базу данных.

Сообщения не удаляются, а остаются на сервере. При первом запуске этот процесс работает нормально. Все необходимые сообщения загружаются в базу данных. Но при втором запуске загружаются те же сообщения, потому что они все еще находятся на почтовом сервере. Это приводит к дублированию записей. Чтобы решить эту проблему, используйте свойство Pop3MessageInfo.UniqueID для проверки, было ли сообщение уже загружено. Уникальный ID сообщения должен храниться в базе данных: он является ключом поиска для обнаружения новых сообщений.

Обнаружение новых сообщений

Чтобы определить новые электронные письма из списка электронных писем на POP3 сервере:

  1. Подключитесь к серверу.
  2. Получите список электронных писем.
  3. Подключитесь к базе данных.
  4. Получите список электронных писем.
  5. Сравните списки.
  6. Сохраните новые электронные письма в базе данных.

Процесс проходит быстрее, когда вы:

  1. Извлекаете все уникальные идентификаторы сообщений в хеш-таблицу.
  2. Ищете в хеш-таблице вместо базы данных для каждого электронного сообщения в цикле for(…).

Вместо запроса к базе данных для каждого сообщения, что требует множества вызовов базы данных, этот метод требует только одного вызова. Следующий фрагмент кода показывает, как обнаружить новые электронные сообщения на POP3 сервере.

public static void run() {
    try {
        // Подключиться к POP3 почтовому серверу и проверить сообщения.
        Pop3Client pop3Client = new Pop3Client("pop.domain.com", 993, "username", "password");

        // Список всех сообщений
        Pop3MessageInfoCollection msgList = pop3Client.listMessages();
        for (Pop3MessageInfo msgInfo : msgList) {
            // Получить уникальный ID сообщения POP3
            String strUniqueID = msgInfo.getUniqueId();

            // Поиск в вашей локальной базе данных или хранилище данных по уникальному ID. Если найдено совпадение, это значит, что оно уже загружено. В противном случае загрузите и сохраните его.
            if (searchPop3MsgInLocalDB(strUniqueID) == true) {
                // Сообщение уже в базе данных. С этим сообщением ничего не нужно делать. Переходите к следующему сообщению.
            } else {
                // Сохраните сообщение
                savePop3MsgInLocalDB(msgInfo);
            }
        }
    } catch (Exception ex) {
        System.err.println(ex);
    }

}

private static void savePop3MsgInLocalDB(Pop3MessageInfo msgInfo) {
    // Откройте соединение с базой данных в соответствии с вашей базой данных. Используйте общие свойства (например, msgInfo.Subject) и сохраняйте в базе данных,
    // например, " INSERT INTO POP3Mails (UniqueID, Subject) VALUES ('" + msgInfo.UniqueID + "' , '" + msgInfo.Subject + "') и выполните запрос для сохранения в базе данных.
}

private static boolean searchPop3MsgInLocalDB(String strUniqueID) {
    // Откройте соединение с базой данных в соответствии с вашей базой данных. Используйте strUniqueID в поисковом запросе для поиска существующих записей,
    // например, " SELECT COUNT(*) FROM POP3Mails WHERE UniqueID = '" + strUniqueID + "' Выполните запрос, верните true, если count == 1. Верните false, если count == 0.
    return false;
}