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

Фильтрация сообщений с использованием EWS

Интерфейс IEWSClient предоставляет метод ListMessages(), который получает все сообщения из почтового ящика. Чтобы получить только сообщения, соответствующие некоторым условиям, используйте перегруженный метод ListMessages(), принимающий класс MailQuery в качестве аргумента. Класс MailQuery предоставляет различные свойства для указания условий, например, дата, тема, отправитель и получатель. Кроме того, API также позволяет применять фильтры по учету регистра для извлечения писем из почтового ящика.

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

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
try
{
// Connect to EWS
const string mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
const string username = "username";
const string password = "password";
const 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.Subject.Contains("Newsletter");
builder.InternalDate.On(DateTime.Now);
MailQuery query = builder.GetQuery();
// Get list of messages
ExchangeMessageInfoCollection messages = client.ListMessages(client.MailboxInfo.InboxUri, query, false);
Console.WriteLine("EWS: " + messages.Count + " message(s) found.");
// Disconnect from EWS
client.Dispose();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

Фильтрация сообщений по сегодняшней дате

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.InternalDate.On(DateTime.Now);

Фильтрация сообщений по диапазону дат

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Emails that arrived in last 7 days
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));

Фильтрация сообщений по конкретному отправителю

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Get emails from specific sender
builder.From.Contains("saqib.razzaq@127.0.0.1");

Фильтрация сообщений по конкретному домену

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Get emails from specific domain
builder.From.Contains("SpecificHost.com");

Фильтрация сообщений по конкретному получателю

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Get emails sent to specific recipient
builder.To.Contains("recipient");

Фильтрация сообщений по ID сообщения

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Get email with specific MessageId
ExchangeQueryBuilder builder1 = new ExchangeQueryBuilder();
builder1.MessageId.Equals("MessageID");

Фильтрация сообщений по всем уведомлениям о доставке почты

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Get Mail Delivery Notifications
builder1 = new ExchangeQueryBuilder();
builder1.ContentClass.Equals(ContentClassType.MDN.ToString());

Фильтрация сообщений по размеру сообщения

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
builder1 = new ExchangeQueryBuilder();
builder1.ItemSize.Greater(80000);

Построение сложных запросов

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

Объединение запросов с помощью AND

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago
builder.From.Contains("SpecificHost.com");
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));

Объединение запросов с помощью 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-.NET
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com"));

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Query building by means of ExchangeQueryBuilder class
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
builder.Subject.Contains("Newsletter", true);
builder.InternalDate.On(DateTime.Now);
MailQuery query = builder.GetQuery();

Фильтрация сообщений с поддержкой постраничного просмотра

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
int itemsPerPage = 5;
string sGuid = Guid.NewGuid().ToString();
string str1 = sGuid + " - " + "Query 1";
string str2 = sGuid + " - " + "Query 2";
MailQueryBuilder queryBuilder1 = new MailQueryBuilder();
queryBuilder1.Subject.Contains(str1);
MailQuery query1 = queryBuilder1.GetQuery();
List<ExchangeMessagePageInfo> pages = new List<ExchangeMessagePageInfo>();
ExchangeMessagePageInfo pageInfo = client.ListMessagesByPage(client.MailboxInfo.InboxUri, query1, itemsPerPage);
pages.Add(pageInfo);
int str1Count = pageInfo.Items.Count;
while (!pageInfo.LastPage)
{
pageInfo = client.ListMessagesByPage(client.MailboxInfo.InboxUri, query1, itemsPerPage, pageInfo.PageOffset + 1);
pages.Add(pageInfo);
str1Count += pageInfo.Items.Count;
}

Сортировка отфильтрованных сообщений по возрастанию/убыванию

Фильтрация электронной почты может поддерживаться с сортировкой сообщений по возрастанию/убыванию. В этом случае используется метод OrderBy, чтобы указать порядок, в котором результаты поиска электронной почты сортируются с помощью класса MailQueryBuilder. Этот метод позволяет определить критерии сортировки для поискового запроса, указывая, должны ли результаты сортироваться по возрастанию или убыванию на основе конкретного свойства.

Метод принимает параметр ascending, который указывает порядок сортировки для указанного свойства. Если параметр ascending равен true, это означает, что результаты поиска должны быть отсортированы по возрастанию. Напротив, если параметр ascending равен false, это означает, что результаты поиска должны быть отсортированы по убыванию.

MailQueryBuilder builder = new MailQueryBuilder();
builder.Subject.Contains("Report");
builder.InternalDate.Since(new DateTime(2020, 1, 1));
builder.Subject.OrderBy(true); // сортировать по возрастанию темы
builder.InternalDate.OrderBy(false); // сортировать по убыванию даты

MailQuery query = builder.GetQuery();

// Получить список сообщений
ExchangeMessageInfoCollection messages = client.ListMessages(client.MailboxInfo.InboxUri, query, false);

В приведённом выше фрагменте кода метод OrderBy применяется дважды, один раз для темы и один раз для даты электронной почты. В результате выполнения метода ListMessages с переданным запросом мы получим список сообщений с темой, содержащей слово “Report”, которые были получены в указанную дату или позже. В то же время результаты будут отсортированы по теме в порядке возрастания. Это означает, что сообщения будут отсортированы в алфавитном порядке от A до Z в зависимости от их темы. Также результаты будут отсортированы по дате в порядке убывания. Это означает, что сообщения будут упорядочены от самых новых к самым старым.