Wykrywanie nowych wiadomości e‑mail na serwerze POP3

Konta POP3 umożliwiają pozostawianie wiadomości na serwerze podczas ich pobierania i odczytywania. Pozostawienie e‑maili na serwerze oznacza, że są dostępne dla innych aplikacji i osób, na przykład użytkowników korzystających z poczty na kilku urządzeniach. Możesz także chcieć pobierać tylko wiadomości spełniające określone kryteria, np. wiadomości o określonym temacie. Aby zarządzać pocztą, możesz;

  • Odczytaj wszystkie wiadomości z serwera poczty POP3 przy użyciu Aspose.Email.
  • Pobierz wiadomości do lokalnej bazy danych.

Wiadomości nie są usuwane, lecz pozostają na serwerze. Przy pierwszym uruchomieniu proces działa prawidłowo – wszystkie wymagane wiadomości są pobrane do bazy danych. Przy drugim uruchomieniu te same wiadomości są pobierane ponownie, ponieważ nadal znajdują się na serwerze e‑mail. Powoduje to duplikaty rekordów. Aby rozwiązać ten problem, użyj Pop3MessageInfo.UniqueID właściwość sprawdzająca, czy wiadomość została już pobrana. Unikalny identyfikator wiadomości musi być przechowywany w bazie danych: jest to klucz wyszukiwania do wykrywania nowych wiadomości.

Wykrywanie nowych wiadomości

Aby zidentyfikować nowe e‑maile z listy e‑maili na serwerze POP3:

  1. Łączysz się z serwerem.
  2. Pobierasz listę e‑maili.
  3. Łączysz się z bazą danych.
  4. Pobierasz listę e‑maili.
  5. Porównujesz listy.
  6. Zapisujesz nowe e‑maile w bazie danych.

Proces jest szybszy, gdy:

  1. Pobierz wszystkie unikalne identyfikatory wiadomości do tabeli haszującej.
  2. Wyszukuj w tabeli haszującej zamiast w bazie danych dla każdej wiadomości e‑mail w pętli for(…) .

Zamiast odpytywać bazę danych dla każdej wiadomości, co wymaga wielu wywołań, ta metoda wymaga tylko jednego wywołania. Poniższy fragment kodu pokazuje, jak wykrywać nowe wiadomości e‑mail na serwerze 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;
}