Фільтрація повідомлень з сервера за допомогою IMAP-клієнта
The ImapClient class надає listMessages() метод, який отримує всі повідомлення зі скриньки. Щоб отримати лише повідомлення, що відповідають певній умові, використовуйте перевантажений listMessages() метод, який приймає MailQuery як аргумент. MailQuery клас надає різноманітні властивості для зазначення умов, наприклад, дата, тема, відправник, отримувач тощо. Перший приклад ілюструє, як фільтрувати повідомлення за датою та темою. Ми також показуємо, як фільтрувати за іншими критеріями та як будувати більш складні запити. API також забезпечує можливість застосовувати чутливі до регістру критерії пошуку для точного фільтрування. API також дозволяє вказувати кодування рядка пошуку для фільтрації повідомлень з поштової скриньки.
Фільтрація повідомлень зі скриньки
- Підключитися та ввійти на IMAP сервер
- Створіть екземпляр MailQuery і встановити властивості
- Викличте ImapClient.listMessages(MailQuery query) метод і передаєте MailQuery з параметрами для отримання лише відфільтрованих повідомлень.
Нижче наведений фрагмент коду показує, як підключитися до IMAP‑скриньки та отримати повідомлення, які надійшли сьогодні і містять слово "newsletter" у темі.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Connect and log in to IMAP
final String host = "host";
final int port = 143;
final String username = "user@host.com";
final String password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.selectFolder("Inbox");
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());
// Build the query and Get list of messages
MailQuery query = builder.getQuery();
ImapMessageInfoCollection messages = client.listMessages(query);
System.out.println("Imap: " + messages.size() + " message(s) found.");
// Disconnect from IMAP
client.dispose();
Отримати повідомлення, що відповідають певним критеріям
Кодові приклади вище фільтрувати повідомлення за темою листа та датою. Ми також можемо використати інші властивості для встановлення інших підтримуваних умов. Нижче наведено кілька прикладів встановлення умов за допомогою MailQuery. Наведені нижче фрагменти коду показують, як фільтрувати листи за:
- Сьогоднішня дата.
- Діапазон дат.
- Від конкретного відправника.
- З конкретного домену.
- Від конкретного отримувача.
Сьогоднішня дата
Нижче наведений фрагмент коду показує, як фільтрувати листи за сьогоднішньою датою.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().on(new Date());
~~
### **Date Range*
The following code snippet shows you how to filter emails on the date range.
~~~Java
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Emails that arrived in last 7 days
Calendar cal = Calendar.getInstance();
builder.getInternalDate().before(cal.getTime());
cal.add(Calendar.DATE, -7);
builder.getInternalDate().since(cal.getTime());
Конкретний відправник
Нижче наведений фрагмент коду показує, як фільтрувати листи за конкретним відправником.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails from specific sender
builder.getFrom().contains("saqib.razzaq@127.0.0.1");
Конкретний домен
Нижче наведений фрагмент коду показує, як фільтрувати листи за конкретним доменом.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails from specific domain
builder.getFrom().contains("SpecificHost.com");
Конкретний отримувач
Нижче наведений фрагмент коду показує, як фільтрувати листи за конкретним отримувачем.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails sent to specific recipient
builder.getTo().contains("recipient");
Створення складних запитів
Якщо різні MailQueryBuilder властивості встановлюються в окремих інструкціях, після чого будуть виконані всі умови. Наприклад, якщо ми хочемо отримати повідомлення в діапазоні дат і від конкретного хоста, нам треба написати три інструкції.
Комбінування запитів за допомогою AND
Наступний фрагмент коду показує, як поєднувати запити за допомогою AND.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago
builder.getFrom().contains("SpecificHost.com");
Calendar cal = Calendar.getInstance();
builder.getInternalDate().before(cal.getTime());
cal.add(Calendar.DATE, -7);
builder.getInternalDate().since(cal.getTime());
Комбінування запитів за допомогою OR
MailQueryBuilder надає or() метод, який приймає два MailQuery екземпляри як параметри. Отримуються повідомлення, що відповідають будь-якій із вказаних двох умов. Нижче наведений фрагмент коду показує, як фільтрувати повідомлення, які мають у темі слово “test” або відправника “noreply@host.com”. Нижче наведений фрагмент коду показує, як комбінувати запити за допомогою OR.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Specify OR condition
builder.or(builder.getSubject().contains("test"), builder.getFrom().contains("noreply@host.com"));
Фільтрація за InternalDate
Повідомлення можна отримати з сервера, орієнтуючись на InternalDate, однак іноді сервер не повертає всі повідомлення, які видно в вхідних. Причиною може бути часовий пояс сервера, оскільки він може не бути UTC для всіх серверів, наприклад Gmail. Aspose надсилає команди типу 008 SEARCH ON 4-May-2014 згідно з протокол IMAP проте результат може відрізнятися через налаштування часового поясу сервера. Новий елемент додано в ImapMessageInfo as InternalDate що додатково допомагає у фільтрації повідомлень. Нижче наведений фрагмент коду показує використання InternalDate для фільтрації повідомлень.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Connect and log in to IMAP
final String host = "host";
final int port = 143;
final String username = "user@host.com";
final String password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.selectFolder("Inbox");
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());
// Build the query and Get list of messages
MailQuery query = builder.getQuery();
ImapMessageInfoCollection messages = client.listMessages(query);
for (ImapMessageInfo info : messages) {
System.out.println("Internal Date: " + info.getInternalDate());
}
// Disconnect from IMAP
client.dispose();
Чутливе до регістру фільтрування електронних листів
Нижче наведений фрагмент коду показує, як використовувати чутливе до регістру фільтрування електронних листів.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter", true);
builder.getInternalDate().on(new Date());
MailQuery query = builder.getQuery();
Вказати кодування для будівника запитів
API ImapQueryBuilder конструктор може бути використаний для вказання кодування рядка пошуку. Це також можна встановити за допомогою DefaultEncoding властивість MailQueryBuilder. Нижче наведений фрагмент коду показує, як вказати кодування для будівника запитів.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Charset.forName("utf-8"));
builder.getSubject().contains("ğüşıöç", true);
MailQuery query = builder.getQuery();
Фільтрація повідомлень з підтримкою пагінації
The ImapClient надає можливість шукати повідомлення у поштовій скриньці та виводити їх зі підтримкою пагінації. Нижче наведений фрагмент коду показує, як фільтрувати повідомлення з підтримкою пагінації.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
/// <summary>
/// This example shows how to search for messages using ImapClient of the API with paging support
/// Introduced in Aspose.Email for .NET 6.4.0
/// </summary>
final ImapClient client = new ImapClient("host.domain.com", 84, "username", "password");
try {
try {
// Append some test messages
int messagesNum = 12;
int itemsPerPage = 5;
MailMessage message = null;
for (int i = 0; i < messagesNum; i++) {
message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35128 - " + UUID.randomUUID(), "111111111111111");
client.appendMessage(ImapFolderInfo.IN_BOX, message);
}
String body = "2222222222222";
for (int i = 0; i < messagesNum; i++) {
message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35128 - " + UUID.randomUUID(), body);
client.appendMessage(ImapFolderInfo.IN_BOX, message);
}
client.selectFolder("Inbox");
ImapQueryBuilder iqb = new ImapQueryBuilder();
iqb.getBody().contains(body);
MailQuery query = iqb.getQuery();
client.selectFolder(ImapFolderInfo.IN_BOX);
ImapMessageInfoCollection totalMessageInfoCol = client.listMessages(query);
System.out.println(totalMessageInfoCol.size());
//////////////////////////////////////////////////////
List<ImapPageInfo> pages = new ArrayList<ImapPageInfo>();
PageSettings ps = new PageSettings();
ps.setFolderName(ImapFolderInfo.IN_BOX);
PageInfo pi = new PageInfo(itemsPerPage);
ImapPageInfo pageInfo = client.listMessagesByPage(query, pi, ps);
pages.add(pageInfo);
while (!pageInfo.getLastPage()) {
pageInfo = client.listMessagesByPage(query, pageInfo.getNextPage(), ps);
pages.add(pageInfo);
}
int retrievedItems = 0;
// foreach to while statements conversion
for (ImapPageInfo folderCol : pages) {
retrievedItems += folderCol.getItems().size();
}
} finally {
}
} finally {
if (client != null)
client.dispose();
}
Фільтрація повідомлень з власним прапором
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.hasFlags(ImapMessageFlags.keyword("custom1"));
queryBuilder.hasNoFlags(ImapMessageFlags.keyword("custom2"));
Фільтрація повідомлень за допомогою кастомного пошуку
Наприклад, стандарт RFC 3501 не дозволяє шукати повідомлення за наявністю вкладень у листах. Але Gmail забезпечує Розширення IMAP які дозволяють виконати такий пошук. Aspose.Email надає customSearch метод ImapQueryBuilder клас для створення відповідного запиту.
Нижче наведений приклад коду показує, як отримати список електронних листів з сервера, які містять вкладення, використовуючи протокол IMAP та власний критерій пошуку:
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);