Работа с сообщениями от сервера

Contents
[ ]

Получение информации о почтовом ящике

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

Также можно получить количество сообщений с использованием свойства MessageCount и размер с помощью свойства OccupiedSize класса Pop3MailBoxInfo. Следующий пример кода показывает, как получить информацию о почтовом ящике. Он демонстрирует, как:

  1. Создать Pop3Client.
  2. Подключиться к POP3-серверу.
  3. Получить размер почтового ящика.
  4. Получить информацию о почтовом ящике.
  5. Получить количество сообщений в почтовом ящике.
  6. Получить занимаемый размер.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
Pop3Client client = new Pop3Client();
// Specify host, username, password, Port and SecurityOptions for your client
client.Host = "pop.gmail.com";
client.Username = "your.username@gmail.com";
client.Password = "your.password";
client.Port = 995;
client.SecurityOptions = SecurityOptions.Auto;
// Get the size of the mailbox, Get mailbox info, number of messages in the mailbox
long nSize = client.GetMailboxSize();
Console.WriteLine("Mailbox size is " + nSize + " bytes.");
Pop3MailboxInfo info = client.GetMailboxInfo();
int nMessageCount = info.MessageCount;
Console.WriteLine("Number of messages in mailbox are " + nMessageCount);
long nOccupiedSize = info.OccupiedSize;
Console.WriteLine("Occupied size is " + nOccupiedSize);

Получение количества электронных писем в почтовом ящике

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
Pop3Client client = new Pop3Client("pop3.server.com", "username", "password");
try
{
client.SecurityOptions = SecurityOptions.Auto;
int i = client.GetMessageCount();
Console.WriteLine("Message count: " + i);
}
catch (Pop3Exception ex)
{
Console.WriteLine("Error:" + ex.ToString());
}

Aspose.Email позволяет разработчикам работать с электронными письмами многими разными способами. Например, они могут получить информацию заголовка перед тем, как решить, загружать ли электронное письмо. Или они могут извлекать электронные письма с сервера и сохранять их без их разбора (быстрее) или после разбора (медленнее). Эта статья показывает, как извлекать и конвертировать электронные письма.

Извлечение информации заголовков электронных писем

Заголовки электронных писем могут дать нам информацию о сообщении, которую мы можем использовать, чтобы решить, извлекать полное сообщение или нет. Обычно информация заголовка включает отправителя, тему, дату получения и т.д. (Заголовки электронных писем описаны подробно в Настройка заголовков электронных писем. Эта тема относится непосредственно к отправке электронной почты с использованием SMTP, но информация о содержании заголовков электронной почты остается действительной для POP3-писем). Следующие примеры показывают, как извлекать заголовки электронных писем с POP3-сервера по номеру последовательности сообщения.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an instance of the Pop3Client class
Pop3Client client = new Pop3Client();
// Specify host, username. password, Port and SecurityOptions for your client
client.Host = "pop.gmail.com";
client.Username = "your.username@gmail.com";
client.Password = "your.password";
client.Port = 995;
client.SecurityOptions = SecurityOptions.Auto;
try
{
HeaderCollection headers = client.GetMessageHeaders(1);
for (int i = 0; i < headers.Count; i++)
{
// Display key and value in the header collection
Console.Write(headers.Keys[i]);
Console.Write(" : ");
Console.WriteLine(headers.Get(i));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
client.Dispose();
}

Извлечение электронных сообщений

Компонент класса Pop3Client предоставляет возможность извлекать электронные сообщения с POP3-сервера и анализировать их в экземпляр MailMessage с помощью компонентов MailMessage. Класс MailMessage содержит несколько свойств и методов для манипуляции содержимым электронной почты. Используя метод FetchMessage класса Pop3Client, вы можете получить экземпляр MailMessage непосредственно с POP3-сервера. Следующий фрагмент кода показывает, как извлечь полное сообщение электронной почты с POP3-сервера.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an instance of the Pop3Client class
Pop3Client client = new Pop3Client();
// Specify host, username, password, Port and SecurityOptions for your client
client.Host = "pop.gmail.com";
client.Username = "your.username@gmail.com";
client.Password = "your.password";
client.Port = 995;
client.SecurityOptions = SecurityOptions.Auto;
try
{
int messageCount = client.GetMessageCount();
// Create an instance of the MailMessage class and Retrieve message
MailMessage message;
for (int i = 1; i <= messageCount; i++)
{
message = client.FetchMessage(i);
Console.WriteLine("From:" + message.From);
Console.WriteLine("Subject:" + message.Subject);
Console.WriteLine(message.HtmlBody);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
client.Dispose();
}

Извлечение информации о сводке сообщения с использованием уникального идентификатора

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
string uniqueId = "unique id of a message from server";
Pop3Client client = new Pop3Client("host.domain.com", 456, "username", "password");
client.SecurityOptions = SecurityOptions.Auto;
Pop3MessageInfo messageInfo = client.GetMessageInfo(uniqueId);
if (messageInfo != null)
{
Console.WriteLine(messageInfo.Subject);
Console.WriteLine(messageInfo.Date);
}

Список сообщений с многосоединением

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an instance of the Pop3Client class
Pop3Client pop3Client = new Pop3Client();
pop3Client.Host = "<HOST>";
pop3Client.Port = 995;
pop3Client.Username = "<USERNAME>";
pop3Client.Password = "<PASSWORD>";
pop3Client.ConnectionsQuantity = 5;
pop3Client.UseMultiConnection = MultiConnectionMode.Enable;
DateTime multiConnectionModeStartTime = DateTime.Now;
Pop3MessageInfoCollection messageInfoCol1 = pop3Client.ListMessages();
TimeSpan multiConnectionModeTimeSpan = DateTime.Now - multiConnectionModeStartTime;
pop3Client.UseMultiConnection = MultiConnectionMode.Disable;
DateTime singleConnectionModeStartTime = DateTime.Now;
Pop3MessageInfoCollection messageInfoCol2 = pop3Client.ListMessages();
TimeSpan singleConnectionModeTimeSpan = DateTime.Now - singleConnectionModeStartTime;
Console.WriteLine("multyConnectionModeTimeSpan: " + multiConnectionModeTimeSpan.TotalMilliseconds);
Console.WriteLine("singleConnectionModeTimeSpan: " + singleConnectionModeTimeSpan.TotalMilliseconds);
double performanceRelation = singleConnectionModeTimeSpan.TotalMilliseconds / multiConnectionModeTimeSpan.TotalMilliseconds;
Console.WriteLine("Performance Relation: " + performanceRelation);

Получение сообщений с сервера и сохранение на диске

Сохранить сообщение на диск без разбора

Если вы хотите загрузить электронные сообщения с POP3-сервера без их разбора, используйте функцию класса Pop3Client SaveMessage. Функция SaveMessage не разбирает сообщение электронной почты, поэтому она быстрее, чем функция FetchMessage. Следующий фрагмент кода показывает, как сохранить сообщение по его номеру последовательности. В этом случае метод SaveMessage сохраняет сообщение в исходном формате EML без разбора.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_POP3();
string dstEmail = dataDir + "InsertHeaders.eml";
// Create an instance of the Pop3Client class
Pop3Client client = new Pop3Client();
// Specify host, username, password, Port and SecurityOptions for your client
client.Host = "pop.gmail.com";
client.Username = "your.username@gmail.com";
client.Password = "your.password";
client.Port = 995;
client.SecurityOptions = SecurityOptions.Auto;
try
{
// Save message to disk by message sequence number
client.SaveMessage(1, dstEmail);
client.Dispose();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine(Environment.NewLine + "Retrieved email messages using POP3 ");

Разбор сообщения перед сохранением

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_POP3();
// Create an instance of the Pop3Client class
Pop3Client client = new Pop3Client();
// Specify host, username and password, Port and SecurityOptions for your client
client.Host = "pop.gmail.com";
client.Username = "your.username@gmail.com";
client.Password = "your.password";
client.Port = 995;
client.SecurityOptions = SecurityOptions.Auto;
try
{
// Fetch the message by its sequence number and Save the message using its subject as the file name
MailMessage msg = client.FetchMessage(1);
msg.Save(dataDir + "first-message_out.eml", SaveOptions.DefaultEml);
client.Dispose();
}
catch (Exception ex)
{
Console.WriteLine(Environment.NewLine + ex.Message);
}
finally
{
client.Dispose();
}

Групповое получение сообщений

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an instance of the Pop3Client class
Pop3Client pop3Client = new Pop3Client();
pop3Client.Host = "<HOST>";
pop3Client.Port = 995;
pop3Client.Username = "<USERNAME>";
pop3Client.Password = "<PASSWORD>";
Pop3MessageInfoCollection messageInfoCol = pop3Client.ListMessages();
Console.WriteLine("ListMessages Count: " + messageInfoCol.Count);
int[] sequenceNumberAr = messageInfoCol.Select((Pop3MessageInfo mi) => mi.SequenceNumber).ToArray();
string[] uniqueIdAr = messageInfoCol.Select((Pop3MessageInfo mi) => mi.UniqueId).ToArray();
IList<MailMessage> fetchedMessagesBySNumMC = pop3Client.FetchMessages(sequenceNumberAr);
Console.WriteLine("FetchMessages-sequenceNumberAr Count: " + fetchedMessagesBySNumMC.Count);
IList<MailMessage> fetchedMessagesByUidMC = pop3Client.FetchMessages(uniqueIdAr);
Console.WriteLine("FetchMessages-uniqueIdAr Count: " + fetchedMessagesByUidMC.Count);

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

Класс Pop3Client, описанный в Подключение к POP3-серверу, предоставляет метод ListMessages(), который получает все сообщения из почтового ящика. Чтобы получить только сообщения, соответствующие какому-либо условию, используйте перегруженный метод ListMessages(), который принимает в качестве аргумента MailQuery. Класс MailQuery предоставляет различные свойства для указания условий запроса, например, дата, тема, отправитель, получатель и так далее. Класс MailQueryBuilder используется для построения выражения поиска. Сначала устанавливаются все условия и ограничения, а затем MailQuery заполняется запросом, разработанным с помощью MailQueryBuilder. Объект класса MailQuery используется классом Pop3Client для извлечения отфильтрованной информации с сервера. Эта статья показывает, как фильтровать сообщения электронной почты из почтового ящика. Первый пример иллюстрирует, как фильтровать сообщения на основе даты и темы. Мы также показываем, как фильтровать по другим критериям и как строить более сложные запросы. Также демонстрируется применение фильтрации по дате и времени для извлечения конкретных писем из почтового ящика. Кроме того, также показано, как применять чувствительную к регистру фильтрацию.

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

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

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

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

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

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

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

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

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

Сегодняшняя дата

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

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

Применение чувствительных к регистру фильтров

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

  • Метод Aspose.Email.StringComparisonField.Contains(string value, bool ignoreCase)
  • Метод Aspose.Email.StringComparisonField.Equals(string value, bool ignoreCase)
  • Метод Aspose.Email.StringComparisonField.NotContains(string value, bool ignoreCase)
  • Метод Aspose.Email.StringComparisonField.NotEquals(string value, bool ignoreCase)
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// IgnoreCase is True
MailQueryBuilder builder1 = new MailQueryBuilder();
builder1.From.Contains("tesT", true);
MailQuery query1 = builder1.GetQuery();
Pop3MessageInfoCollection messageInfoCol1 = client.ListMessages(query1);