Фильтрация сообщений из почтового ящика Exchange с использованием WebDav

Фильтрация сообщений с помощью Web Dav

Чтобы получить отфильтрованные сообщения из почтового ящика:

  1. Подключитесь к серверу Exchange.
  2. Создайте экземпляр MailQuery и задайте необходимые свойства.
  3. Вызовите метод ExchangeClient.listMessages(MailQuery query) и передайте MailQuery в параметрах, чтобы получить только отфильтрованные сообщения.

Ниже приведённые примеры кода показывают, как подключиться к почтовому ящику Exchange и получить сообщения, в теме которых содержится строка "Newsletter" и которые были отправлены сегодня.

ExchangeClient client = new ExchangeClient("http://MachineName/exchange/Username", "username", "password", "domain");
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

// Query building by means of ExchangeQueryBuilder class
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
// Subject contains "Newsletter"
builder.getSubject().contains("Newsletter");

// Emails that arrived today
try {
	builder.getInternalDate().on(sdf.parse("10/05/2016 10:00:00"));
} catch (ParseException e) {
	e.printStackTrace();
}

// Build the query
MailQuery query = builder.getQuery();

// Get list of messages
ExchangeMessageInfoCollection messages = client.listMessages(client.getMailboxInfo().getInboxUri(), query, false);
System.out.println("Imap: " + messages.size() + " message(s) found.");

Получить сообщения, отвечающие определённым критериям

Приведённые выше образцы кода фильтруют сообщения по теме письма и дате. Мы также можем фильтровать по другим свойствам. Ниже приведены некоторые примеры установки условий с использованием MailQuery.

Критерий фильтрации: дата сегодня

Следующий фрагмент кода показывает, как отфильтровать все письма по дате сегодняшнего дня.

// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().on(new Date());

Критерий фильтрации: диапазон дат

Следующий фрагмент кода показывает, как отфильтровать все письма по диапазону дат.

MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().beforeOrEqual(new Date());
builder.getInternalDate().since(new Date(new Date().getTime() + TimeUnit.DAYS.toDays(1)));

Критерий фильтрации: конкретный отправитель

Следующий фрагмент кода показывает, как отфильтровать все письма по конкретному отправителю.

MailQueryBuilder builder = new MailQueryBuilder();
// Get emails from specific sender
builder.getFrom().contains("saqib.razzaq@127.0.0.1");

Критерий фильтрации: конкретный домен

Следующий фрагмент кода показывает, как отфильтровать все письма по конкретному домену.

MailQueryBuilder builder = new MailQueryBuilder();
// Get emails from specific domain
builder.getFrom().contains("SpecificHost.com");

Критерий фильтрации: конкретный получатель

Следующий фрагмент кода показывает, как отфильтровать все письма по конкретному получателю.

MailQueryBuilder builder = new MailQueryBuilder();
// Get emails sent to specific recipient
builder.getTo().contains("recipient");

Критерий фильтрации: по MessageID

Следующий фрагмент кода показывает, как отфильтровать все письма по MessageID.

// Get email with specific MessageId
ExchangeQueryBuilder builder1 = new ExchangeQueryBuilder();
builder1.getMessageId().equals("MessageID");

Критерий фильтрации: все уведомления о доставке почты

Следующий фрагмент кода показывает, как отфильтровать все письма на основе всех уведомлений о доставке почты.

// Get Mail Delivery Notifications
builder1 = new ExchangeQueryBuilder();
builder1.getContentClass().equals(ContentClassType.getMDN().toString());

Создание сложных запросов

Если разные свойства QueryBuilder задаются в отдельных операторах, все условия учитываются. Например, чтобы получить сообщение в определённом диапазоне дат и от конкретного хоста, напишите три оператора:

Комбинирование запросов с AND

MailQueryBuilder builder = new MailQueryBuilder();

// Emails from specific host
builder.getFrom().contains("SpecificHost.com");
// AND all emails that arrived before today
builder.getInternalDate().before(new Date());
// AND all emails that arrived since 7 days ago
builder.getInternalDate().since(new Date(new Date().getTime() + TimeUnit.DAYS.toDays(-7)));

Комбинирование запросов с OR

QueryBuilder предоставляет метод or() который принимает два экземпляра MailQuery в качестве параметров. Он получает сообщения, соответствующие любому из двух указанных условий. Ниже пример фильтрации сообщений, у которых в теме присутствует слово "test" или отправитель "noreply@host.com".

MailQueryBuilder builder = new MailQueryBuilder();
		
// Specify OR condition
builder.or(builder.getSubject().contains("test"), builder.getFrom().contains("noreply@host.com"));

Фильтрация электронных писем с учетом регистра

Электронные письма могут быть отфильтрованы с учетом регистра, указав флаг IgnoreCase в критериях фильтра, как показано в следующем примере.

//IgnoreCase is True
MailQueryBuilder builder1 = new MailQueryBuilder();
builder1.getFrom().contains("tesT", true);
MailQuery query1 = builder1.getQuery();