Фильтрация сообщений с сервера с использованием IMAP-клиента
Этот ImapClient class предоставляет listMessages() метод, который получает все сообщения из ящика. Чтобы получить только сообщения, соответствующие некоторому условию, используйте перегруженный listMessages() метод, который принимает MailQuery в качестве аргумента. The 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
В следующем фрагменте кода показано, как комбинировать запросы с помощью И.
// 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 как 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();
Фильтрация сообщений с поддержкой постраничного вывода
Этот 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);