Обнаружение новых электронных сообщений на POP3 сервере
С POP3‑аккаунтами вы можете оставлять сообщения на сервере при их загрузке и чтении. Оставление писем на сервере означает, что они доступны другим приложениям и пользователям, например, тем, кто получает почту с нескольких устройств. Или вы можете захотеть загружать только сообщения, соответствующие определённым критериям, например, сообщения с определённой темой. Для управления почтой вы можете:
- Прочитайте все сообщения с POP3 почтового сервера с помощью Aspose.Email.
- Скачайте сообщения в локальную базу данных.
Сообщения не удаляются, а остаются на сервере. При первом запуске процесс работает корректно: все необходимые сообщения загружаются в базу данных. Но при втором запуске те же сообщения загружаются снова, поскольку они всё ещё находятся на почтовом сервере. Это приводит к дублированию записей. Чтобы решить эту проблему, используйте Pop3MessageInfo.UniqueID свойство для проверки, было ли сообщение уже загружено. Уникальный идентификатор сообщения должен храниться в базе данных: он служит ключом поиска для обнаружения новых сообщений.
Обнаружение новых сообщений
Чтобы определить новые письма из списка писем на POP3 сервере:
- Подключаетесь к серверу.
- Получаете список писем.
- Подключаетесь к базе данных.
- Получаете список писем.
- Сравниваете списки.
- Сохраняете новые письма в базу данных.
Процесс ускоряется, когда вы:
- Получить все уникальные идентификаторы сообщений в хеш-таблицу.
- Искать в хеш-таблице вместо базы данных для каждого электронного сообщения в цикле for(…).
Вместо того чтобы запрашивать базу данных для каждого сообщения, требуя множества вызовов к базе, этот метод требует лишь один вызов. Ниже приведён фрагмент кода, показывающий, как обнаружить новые электронные сообщения на 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;
}