Фильтрация сообщений из почтового ящика Exchange
Фильтрация сообщений с использованием EWS
Этот IEWSClient class предоставляет listMessages() метод, который получает все сообщения из почтового ящика. Чтобы получить только сообщения, соответствующие определённому условию, используйте перегруженный listMessages() метод, который принимает MailQuery класс в качестве аргумента. The MailQuery класс предоставляет различные свойства для указания условий, например, дата, тема, отправитель и получатель. Кроме того, API позволяет применять фильтры с учётом регистра при получении электронных писем из почтового ящика.
Фильтрация сообщений
Чтобы получить отфильтрованные сообщения из почтового ящика:
- Подключитесь к серверу Exchange.
- Создайте экземпляр MailQuery и задайте необходимые свойства.
- Вызовите метод IEWSClient.listMessages() и передайте в параметрах MailQuery, чтобы получить только отфильтрованные сообщения.
Следующий фрагмент кода показывает, как подключиться к IMAP‑почтовому ящику и получить сообщения, в теме которых присутствует строка "Newsletter" и которые были отправлены сегодня.
try {
// Connect to EWS
final String mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
final String username = "username";
final String password = "password";
final String domain = "domain";
IEWSClient client = EWSClient.getEWSClient(mailboxUri, username, password, domain);
// Query building by means of ExchangeQueryBuilder class
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
// Set Subject and Emails that arrived today
builder.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());
MailQuery query = builder.getQuery();
// Get list of messages
ExchangeMessageInfoCollection messages = client.listMessages(client.getMailboxInfo().getInboxUri(), query, false);
System.out.println("EWS: " + messages.size() + " message(s) found.");
// Disconnect from EWS
client.dispose();
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
Фильтрация сообщений по критерию
Приведённые выше образцы кода фильтруют сообщения по теме письма и дате. Мы также можем фильтровать по другим свойствам. Ниже приведены некоторые примеры установки условий с использованием MailQuery.
Фильтрация сообщений по сегодняшней дате
Следующий фрагмент кода показывает, как отфильтровать все электронные письма на основе текущей даты.
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().on(new Date());
Фильтрация сообщений по диапазону дат
Следующий фрагмент кода показывает, как отфильтровать все письма по диапазону дат.
// 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());
Фильтрация сообщений по конкретному отправителю
Следующий фрагмент кода показывает, как отфильтровать все письма по конкретному отправителю.
// Get emails from specific sender
builder.getFrom().contains("saqib.razzaq@127.0.0.1");
Фильтрация сообщений по конкретному домену
Следующий фрагмент кода показывает, как отфильтровать все письма по конкретному домену.
// Get emails from specific domain
builder.getFrom().contains("SpecificHost.com");
Фильтрация сообщений по конкретному получателю
Следующий фрагмент кода показывает, как отфильтровать все письма по конкретному получателю.
// Get emails sent to specific recipient
builder.getTo().contains("recipient");
Фильтрация сообщений по MessageID
Следующий фрагмент кода показывает, как отфильтровать все письма по MessageID.
// Get email with specific MessageId
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
builder.getMessageId().equals("MessageID");
Фильтрация сообщений по всем уведомлениям о доставке почты
Следующий фрагмент кода показывает, как отфильтровать все письма на основе всех уведомлений о доставке почты.
// Get Mail Delivery Notifications
builder = new ExchangeQueryBuilder();
builder.getContentClass().equals(ContentClassType.getMDN().toString());
Фильтрация сообщений по размеру
builder = new ExchangeQueryBuilder();
builder.getItemSize().greater(80000);
Фильтрация сообщений по строковому значению
Следующий фрагмент кода показывает, как отфильтровать все электронные письма на основе указанной строки в заголовках (тема, от, до, копия). getText() метод возвращает строковое значение вместе с телом сообщения.
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
builder.getText().equals("SomeText");
MailQuery query = builder.getQuery();
ExchangeMessageInfoCollection messages = ewsClient.listMessages("InboxUri", query, false);
Фильтрация сообщений в порядке возрастания/убывания
Aspose.Email предоставляет ComparisonField.orderBy(boolean ascending) метод, устанавливающий значение, указывающее, использует ли клиент сортировку по возрастанию или убыванию в поле поиска. Он позволяет сортировать электронные сообщения в порядке возрастания/убывания на основе критериев, указанных MailQueryBuilder.
Ниже показан фрагмент кода, демонстрирующий фильтрацию сообщений по возрастанию/убыванию:
MailQueryBuilder builder = new MailQueryBuilder();
builder.getSubject().contains("Report");
builder.getInternalDate().since(sinceDate);
builder.getSubject().orderBy(true); // sort the subject ascending
builder.getInternalDate().orderBy(false); // sort the date descending
ExchangeMessageInfoCollection miColl = client.listMessages(client.getMailboxInfo().getInboxUri(), builder.getQuery());
Создание сложных запросов
Если разные MailQueryBuilder свойства задаются отдельным оператором, и все условия должны совпасть. Например, чтобы получить сообщение в определённом диапазоне дат и от конкретного хоста, напишите три операторa:
Комбинирование запросов с AND
Следующий фрагмент кода показывает, как комбинировать запросы с помощью AND.
// 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.
builder.or(builder.getSubject().contains("test"), builder.getFrom().contains("noreply@host.com"));
Фильтрация электронных писем с учетом регистра
Электронные письма могут быть отфильтрованы с учётом регистра, указав флаг IgnoreCase в критериях фильтрации, как показано в следующем фрагменте кода.
// Query building by means of ExchangeQueryBuilder class
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
builder.getSubject().contains("Newsletter", true);
builder.getInternalDate().on(new Date());
MailQuery query = builder.getQuery();
Фильтрация сообщений с поддержкой постраничного вывода
int itemsPerPage = 5;
String sGuid = UUID.randomUUID().toString();
String str1 = sGuid + " - " + "Query 1";
String str2 = sGuid + " - " + "Query 2";
MailQueryBuilder queryBuilder1 = new MailQueryBuilder();
queryBuilder1.getSubject().contains(str1);
MailQuery query1 = queryBuilder1.getQuery();
List<ExchangeMessagePageInfo> pages = new ArrayList<ExchangeMessagePageInfo>();
ExchangeMessagePageInfo pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), query1, itemsPerPage);
pages.add(pageInfo);
int str1Count = pageInfo.getItems().size();
while (!pageInfo.getLastPage()) {
pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), query1, itemsPerPage, pageInfo.getPageOffset() + 1);
pages.add(pageInfo);
str1Count += pageInfo.getItems().size();
}