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

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

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

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
try
{
// Connect to EWS
const System::String mailboxUri = u"https://outlook.office365.com/ews/exchange.asmx";
const System::String username = u"username";
const System::String password = u"password";
const System::String domain = u"domain";
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
// Query building by means of ExchangeQueryBuilder class
System::SharedPtr<ExchangeQueryBuilder> builder = System::MakeObject<ExchangeQueryBuilder>();
// Set Subject and Emails that arrived today
builder->get_Subject()->Contains(u"Newsletter");
builder->get_InternalDate()->On(System::DateTime::get_Now());
System::SharedPtr<MailQuery> query = builder->GetQuery();
// Get list of messages
System::SharedPtr<ExchangeMessageInfoCollection> messages = client->ListMessages(client->get_MailboxInfo()->get_InboxUri(), query, false);
System::Console::WriteLine(System::String(u"EWS: ") + messages->get_Count() + u" message(s) found.");
// Disconnect from EWS
client->Dispose();
}
catch (System::Exception& ex)
{
System::Console::WriteLine(ex.get_Message());
}

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

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
// Emails that arrived today
System::SharedPtr<MailQueryBuilder> builder = System::MakeObject<MailQueryBuilder>();
builder->get_InternalDate()->On(System::DateTime::get_Now());

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

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

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

Критерии фильтрации по конкретному отправителю

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

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

Критерии фильтрации по конкретному домену

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

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

Критерии фильтрации по конкретному получателю

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

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
// Get email with specific MessageId
System::SharedPtr<ExchangeQueryBuilder> builder1 = System::MakeObject<ExchangeQueryBuilder>();
builder1->get_MessageId()->Equals(u"MessageID");

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
// Get Mail Delivery Notifications
builder1 = System::MakeObject<ExchangeQueryBuilder>();
builder1->get_ContentClass()->Equals(System::ObjectExt::ToString(ContentClassType::get_MDN()));

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
builder1 = System::MakeObject<ExchangeQueryBuilder>();
builder1->get_ItemSize()->Greater(80000);

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

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago
builder->get_From()->Contains(u"SpecificHost.com");
builder->get_InternalDate()->Before(System::DateTime::get_Now());
builder->get_InternalDate()->Since(System::DateTime::get_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-C
builder->Or(builder->get_Subject()->Contains(u"test"), builder->get_From()->Contains(u"noreply@host.com"));

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
// Query building by means of ExchangeQueryBuilder class
System::SharedPtr<ExchangeQueryBuilder> builder = System::MakeObject<ExchangeQueryBuilder>();
builder->get_Subject()->Contains(u"Newsletter", true);
builder->get_InternalDate()->On(System::DateTime::get_Now());
System::SharedPtr<MailQuery> query = builder->GetQuery();
// Get list of messages
System::SharedPtr<ExchangeMessageInfoCollection> messages = client->ListMessages(client->get_MailboxInfo()->get_InboxUri(), query, false);
System::Console::WriteLine(System::String(u"EWS: ") + messages->get_Count() + u" message(s) found.");
// Disconnect from EWS
client->Dispose();

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
int32_t itemsPerPage = 5;
System::String sGuid = System::ObjectExt::ToString(System::Guid::NewGuid());
System::String str1 = sGuid + u" - " + u"Query 1";
System::String str2 = sGuid + u" - " + u"Query 2";
System::SharedPtr<MailQueryBuilder> queryBuilder1 = System::MakeObject<MailQueryBuilder>();
queryBuilder1->get_Subject()->Contains(str1);
System::SharedPtr<MailQuery> query1 = queryBuilder1->GetQuery();
System::SharedPtr<System::Collections::Generic::List<System::SharedPtr<ExchangeMessagePageInfo>>> pages = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<ExchangeMessagePageInfo>>>();
System::SharedPtr<ExchangeMessagePageInfo> pageInfo = client->ListMessagesByPage(client->get_MailboxInfo()->get_InboxUri(), query1, itemsPerPage);
pages->Add(pageInfo);
int32_t str1Count = pageInfo->get_Items()->get_Count();
while (!pageInfo->get_LastPage())
{
pageInfo = client->ListMessagesByPage(client->get_MailboxInfo()->get_InboxUri(), query1, itemsPerPage, pageInfo->get_PageOffset() + 1);
pages->Add(pageInfo);
str1Count += pageInfo->get_Items()->get_Count();
}