Фильтрация и сортировка сообщений в почтовом ящике Exchange Server с использованием EWS
Фильтрация и сортировка сообщений с помощью EWS
Этот IEWSClient интерфейс предоставляет ListMessages() метод, который получает все сообщения из почтового ящика. Чтобы получить только сообщения, соответствующие определённому условию, используйте перегруженный ListMessages() метод, который принимает MailQuery класс в качестве аргумента. The MailQuery класс предоставляет различные свойства для указания условий, например, дата, тема, отправитель и получатель. Кроме того, API позволяет применять фильтры с учётом регистра при получении электронных писем из почтового ящика.
Фильтрация сообщений по критерию
Чтобы получить отфильтрованные сообщения из почтового ящика:
- Подключитесь к серверу Exchange.
- Создайте экземпляр MailQuery и задать нужные свойства.
- Вызвать IEWSClient.ListMessages() метод и передайте MailQuery в параметрах, чтобы получить только отфильтрованные сообщения.
Следующий фрагмент кода показывает, как подключиться к IMAP‑почтовому ящику и получить сообщения, в теме которых присутствует строка "Newsletter" и которые были отправлены сегодня.
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);
}
По сегодняшней дате
Следующий фрагмент кода показывает, как отфильтровать все электронные письма на основе текущей даты.
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.InternalDate.On(DateTime.Now);
По диапазону дат
Следующий фрагмент кода показывает, как отфильтровать все письма по диапазону дат.
// Emails that arrived in last 7 days
builder.InternalDate.Before(DateTime.Now);
builder.InternalDate.Since(DateTime.Now.AddDays(-7));
По отправителю
Следующий фрагмент кода показывает, как отфильтровать все письма по конкретному отправителю.
// Get emails from specific sender
builder.From.Contains("saqib.razzaq@127.0.0.1");
По домену
Следующий фрагмент кода показывает, как отфильтровать все письма по конкретному домену.
// Get emails from specific domain
builder.From.Contains("SpecificHost.com");
По получателю
Следующий фрагмент кода показывает, как отфильтровать все письма по конкретному получателю.
// Get emails sent to specific recipient
builder.To.Contains("recipient");
По MessageID
Следующий фрагмент кода показывает, как отфильтровать все письма по MessageID.
// Get email with specific MessageId
ExchangeQueryBuilder builder1 = new ExchangeQueryBuilder();
builder1.MessageId.Equals("MessageID");
По уведомлениям о доставке почты
Следующий фрагмент кода показывает, как отфильтровать все письма на основе всех уведомлений о доставке почты.
// Get Mail Delivery Notifications
builder1 = new ExchangeQueryBuilder();
builder1.ContentClass.Equals(ContentClassType.MDN.ToString());
По размеру сообщения
builder1 = new ExchangeQueryBuilder();
builder1.ItemSize.Greater(80000);
Создание сложных запросов
Если разные 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.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.
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com"));
Фильтрация электронных писем с учетом регистра
Электронные письма могут быть отфильтрованы с учётом регистра, указав флаг IgnoreCase в критериях фильтрации, как показано в следующем фрагменте кода.
// 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();
Фильтрация сообщений с поддержкой постраничного вывода
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); // sort the subject ascending
builder.InternalDate.OrderBy(false); // sort the date descending
MailQuery query = builder.GetQuery();
// Get list of messages
ExchangeMessageInfoCollection messages = client.ListMessages(client.MailboxInfo.InboxUri, query, false);
В приведённом выше фрагменте кода метод OrderBy применяется дважды: один раз к теме, один раз к дате писем. В результате выполнения метода ListMessages с переданным запросом мы получим список сообщений, тема которых содержит слово "Report" и которые были получены в указанную дату или позже. При этом результаты будут отсортированы по теме в порядке возрастания — от A до Z в зависимости от темы. Также результаты будут отсортированы по дате в порядке убывания, то есть от новых к старым.
Фильтрация сообщений с использованием AQS
С помощью Aspose.Email for .NET пользователи могут воспользоваться мощными возможностями Advanced Query Syntax (AQS) для фильтрации сообщений непосредственно из почтового ящика Exchange. AQS предоставляет надёжный и интуитивный способ построения запросов, позволяющих точно отбирать письма по таким критериям, как дата, отправитель и тема. Для более подробного ознакомления с интеграцией AQS в процессы фильтрации почты и с образцами кода по реализации фильтрации сообщений с использованием AQS в Aspose.Email for .NET, пожалуйста, обратитесь к Фильтрация сообщений с помощью AQS из почтового ящика Exchange статья.