Фильтрация электронной почты IMAP — методы, критерии и примеры кода
Базовая фильтрация сообщений
Этот ImapClient class предоставляет ListMessages() метод, который получает все сообщения из ящика. Чтобы получить только сообщения, соответствующие некоторому условию, используйте перегруженный ListMessages() метод, который принимает MailQuery в качестве аргумента. The MailQuery класс предоставляет различные свойства для указания условий, например, дату, тему, отправителя, получателя и т. д. Первый пример иллюстрирует, как фильтровать сообщения по дате и теме. Мы также показываем, как фильтровать по другим критериям и как строить более сложные запросы. API также обеспечивает возможность применять чувствительный к регистру поиск для точного соответствия критериям фильтрации. API также позволяет задавать кодировку строки поиска при фильтрации сообщений из почтового ящика.
Фильтрация сообщений из почтового ящика
- Подключиться и войти на IMAP‑сервер
- Создать экземпляр MailQuery и установить свойства
- Вызвать ImapClient.ListMessages(MailQuery query) метод и передайте MailQuery с параметрами для получения только отфильтрованных сообщений.
Ниже показан фрагмент кода, демонстрирующий, как подключиться к IMAP‑почтовому ящику и получить сообщения, полученные сегодня и содержащие слово "newsletter" в теме.
// 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. Ниже приведённые фрагменты кода показывают, как фильтровать письма по:
- Дата сегодня.
- Диапазон дат.
- От конкретного отправителя.
- От конкретного домена.
- От конкретного получателя.
Сегодняшняя дата
Ниже показан фрагмент кода, демонстрирующий, как фильтровать письма по дате сегодняшнего дня.
// 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");
Продвинутое построение запросов
Если разные MailQueryBuilder свойства задаются в отдельных операторах, затем все условия будут совпадать. Например, если мы хотим получить сообщения в диапазоне дат и от конкретного хоста, нам нужно написать три оператора.
Комбинировать запросы с 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.
// 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 для фильтрации сообщений.
// 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();
Регистрозависимая фильтрация
Ниже показан фрагмент кода, демонстрирующий, как использовать чувствительную к регистру фильтрацию писем.
// 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. Ниже показан фрагмент кода, демонстрирующий, как указать кодировку для билдера запросов.
// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Encoding.UTF8);
builder.Subject.Contains("ğüşıöç", true);
MailQuery query = builder.GetQuery();
Пользовательские параметры фильтрации
Фильтрация сообщений с пользовательским флагом
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);
Фильтрация сообщений с поддержкой постраничного вывода
Этот ImapClient обеспечивает возможность поиска сообщений в почтовом ящике и их вывод с поддержкой постраничного отображения. Ниже показан фрагмент кода, демонстрирующий, как фильтровать сообщения с поддержкой постраничного вывода.
///<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
{
}
}