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

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

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

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect and log in to IMAP
const string host = "host";
const int port = 143;
const string username = "user@host.com";
const string password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.SelectFolder("Inbox");
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.Subject.Contains("Newsletter");
builder.InternalDate.On(DateTime.Now);
// Build the query and Get list of messages
MailQuery query = builder.GetQuery();
ImapMessageInfoCollection messages = client.ListMessages(query);
Console.WriteLine("Imap: " + messages.Count + " message(s) found.");
// Disconnect from IMAP
client.Dispose();

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

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

  1. Дате сегодня.
  2. Диапазону дат.
  3. Из конкретного отправителя.
  4. Из конкретного домена.
  5. Из конкретного получателя.

Дата сегодня

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

// 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");

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

Если различные свойства 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
// Specify OR condition
builder.Or(builder.Subject.Contains("test"), builder.From.Contains("noreply@host.com"));

Фильтрация по InternalDate

Сообщения могут быть извлечены с сервера на основе InternalDate, однако иногда сервер не возвращает все сообщения, видимые во входящих. Причиной может быть часовой пояс сервера, поскольку он может не быть UTC для всех серверов, таких как Gmail. Aspose отправляет команды как 008 SEARCH ON 4-May-2014 согласно IMAP-протоколу, однако результат может отличаться из-за настроек часового пояса сервера. В ImapMessageInfo добавлен новый член InternalDate, который дополнительно помогает фильтровать сообщения. Следующий фрагмент кода показывает использование InternalDate для фильтрации сообщений.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect and log in to IMAP
const string host = "host";
const int port = 143;
const string username = "user@host.com";
const string password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.SelectFolder("Inbox");
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.Subject.Contains("Newsletter");
builder.InternalDate.On(DateTime.Now);
// Build the query and Get list of messages
MailQuery query = builder.GetQuery();
ImapMessageInfoCollection messages = client.ListMessages(query);
foreach (ImapMessageInfo info in messages)
{
Console.WriteLine("Internal Date: " + info.InternalDate);
}
// Disconnect from IMAP
client.Dispose();

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.Subject.Contains("Newsletter", true);
builder.InternalDate.On(DateTime.Now);
MailQuery query = builder.GetQuery();

Указать кодировку для построителя запросов

Конструктор API ImapQueryBuilder может быть использован для указания кодировки для строки поиска. Это также может быть установлено с помощью свойства DefaultEncoding MailQueryBuilder. Следующий фрагмент кода показывает, как указать кодировку для построителя запросов.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Encoding.UTF8);
builder.Subject.Contains("ğüşıöç", true);
MailQuery query = builder.GetQuery();

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

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
///<summary>
/// This example shows how to search for messages using ImapClient of the API with paging support
/// Introduced in Aspose.Email for .NET 6.4.0
///</summary>
using (ImapClient client = new ImapClient("host.domain.com", 84, "username", "password"))
{
try
{
// Append some test messages
int messagesNum = 12;
int itemsPerPage = 5;
MailMessage message = null;
for (int i = 0; i < messagesNum; i++)
{
message = new MailMessage(
"from@domain.com",
"to@domain.com",
"EMAILNET-35128 - " + Guid.NewGuid(),
"111111111111111");
client.AppendMessage(ImapFolderInfo.InBox, message);
}
string body = "2222222222222";
for (int i = 0; i < messagesNum; i++)
{
message = new MailMessage(
"from@domain.com",
"to@domain.com",
"EMAILNET-35128 - " + Guid.NewGuid(),
body);
client.AppendMessage(ImapFolderInfo.InBox, message);
}
client.SelectFolder("Inbox");
ImapQueryBuilder iqb = new ImapQueryBuilder();
iqb.Body.Contains(body);
MailQuery query = iqb.GetQuery();
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection totalMessageInfoCol = client.ListMessages(query);
Console.WriteLine(totalMessageInfoCol.Count);
//////////////////////////////////////////////////////
List<ImapPageInfo> pages = new List<ImapPageInfo>();
PageSettings pageSettings = new PageSettings();
pageSettings.FolderName = ImapFolderInfo.InBox;
ImapPageInfo pageInfo = client.ListMessagesByPage(query, new PageInfo(itemsPerPage, 0), pageSettings);
pages.Add(pageInfo);
while (!pageInfo.LastPage)
{
pageInfo = client.ListMessagesByPage(query, pageInfo.NextPage, pageSettings);
pages.Add(pageInfo);
}
int retrievedItems = 0;
foreach (ImapPageInfo folderCol in pages)
retrievedItems += folderCol.Items.Count;
}
finally
{
}
}

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.HasFlags(ImapMessageFlags.Keyword("custom1"));
queryBuilder.HasNoFlags(ImapMessageFlags.Keyword("custom2"));

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

Например, стандарт RFC 3501 не позволяет выполнять поиск сообщений на основе наличия вложений в сообщениях. Но Gmail предоставляет IMAP-расширения, которые позволяют выполнять такой поиск. Следующий фрагмент кода показывает, как сделать соответствующий запрос.

ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.CustomSearch("X-GM-RAW \"has:attachment\"");

MailQuery mailQuery = queryBuilder.GetQuery();
ImapMessageInfoCollection messageInfoCollection = imapClient.ListMessages(mailQuery);