Отримання та перелік електронних листів з IMAP‑сервера

Отримання та перелік повідомлень

Як отримати ідентифікаційну інформацію про повідомлення в скриньці

Під час отримання та обробки електронних листів ви можете отримати детальну ідентифікаційну інформацію, таку як порядкові номери та унікальні ідентифікатори, за допомогою наступних можливостей, що надає остання версія Aspose.Email для .NET:

Aspose.Email.ImapMessageInfo клас: представляє ідентифікаційну інформацію про повідомлення в IMAP‑скриньці.

ImapMessageInfo.SequenceNumber властивість: отримує порядковий номер повідомлення.

ImapMessageInfo.UniqueId властивість: отримує унікальний ідентифікатор повідомлення.

Aspose.Email.MailMessage.ItemId властивість: представляє додаткову ідентифікаційну інформацію про повідомлення в межах скриньки.

Нижченаведений фрагмент коду демонструє, як отримати ідентифікаційну інформацію про повідомлення у IMAP‑скриньці:

  1. Створіть екземпляр ImapClient клас, вказуючи необхідні параметри, такі як хост IMAP‑сервера, порт, email‑адреса, пароль і параметри безпеки.
  2. Використайте ListMessages метод для отримання списку повідомлень з папки "INBOX". Обмежте список першими п’ятьма повідомленнями за допомогою методу Take(5).
  3. Витягніть порядкові номери зазначених повідомлень, використовуючи SequenceNumber властивість кожного повідомлення.
  4. Використайте FetchMessages метод для отримання повних даних повідомлень з сервера, використовуючи послідовні номери, отримані на попередньому кроці.
  5. Переберіть отримані повідомлення і для кожного повідомлення отримайте та відобразіть наступну інформацію:
  • Порядковий номер повідомлення.
  • Властивість ItemId.SequenceNumber.
  • Тема повідомлення.
using (var client = new ImapClient(imapHost, port, emailAddress, password, securityOption))
{
    // List the first 5 messages from the inbox
    var msgs = client.ListMessages("INBOX").Take(5);
    
    // Get sequence numbers of the messages
    var seqIds = msgs.Select(t => t.SequenceNumber);
    
    // Fetch messages based on sequence numbers
    var msgsViaFetch = client.FetchMessages(seqIds);
    
    for (var i = 0; i < 5; i++)
    {
        var thisMsg = msgsViaFetch[i];
        Console.WriteLine($"Message ID: {seqIds.ElementAt(i)} SequenceNumber: {thisMsg.ItemId.SequenceNumber} Subject: {thisMsg.Subject}");
    }
}

Перелік MIME‑ідентифікаторів повідомлень з сервера

ImapMessageInfo надає MIME MessageId для ідентифікації повідомлення без витягнення повного повідомлення. Нижче наведений фрагмент коду показує, як перелічити MIME‑messageId.

ImapClient client = new ImapClient();
client.Host = "domain.com";
client.Username = "username";
client.Password = "password";
    
try
{
    ImapMessageInfoCollection messageInfoCol = client.ListMessages("Inbox");
    foreach (ImapMessageInfo info in messageInfoCol)
    {
        // Display MIME Message ID
        Console.WriteLine("Message Id = " + info.MessageId);
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

Список повідомлень з сервера

Aspose.Email надає 2‑членну перевантажену варіанту ListMessages() для отримання вказаної кількості повідомлень за запитом. Нижченаведений фрагмент коду показує, як перелічити повідомлення.


imapClient.SelectFolder("Inbox");
ImapQueryBuilder builder = new ImapQueryBuilder();
MailQuery query =
	builder.Or(
	builder.Or(
	builder.Or(
	builder.Or(
	builder.Subject.Contains(" (1) "),
	builder.Subject.Contains(" (2) ")),
	builder.Subject.Contains(" (3) ")),
	builder.Subject.Contains(" (4) ")),
	builder.Subject.Contains(" (5) "));
ImapMessageInfoCollection messageInfoCol4 = imapClient.ListMessages(query, 4);
Console.WriteLine((messageInfoCol4.Count == 4) ? "Success" : "Failure");

Перерахувати повідомлення рекурсивно

Протокол IMAP підтримує рекурсивне перелічення повідомлень у папці скриньки. Це дозволяє також перелічати повідомлення з підпапок. Нижче наведений фрагмент коду показує, як рекурсивно перелічити повідомлення.

// Create an imapclient with host, user and password
ImapClient client = new ImapClient();
client.Host = "domain.com";
client.Username = "username";
client.Password = "password";
client.SelectFolder("InBox");
ImapMessageInfoCollection msgsColl = client.ListMessages(true);
Console.WriteLine("Total Messages: " + msgsColl.Count);

Перерахувати повідомлення з MultiConnection

ImapClient надає UseMultiConnection властивість, яку можна використати для створення декількох з’єднань під час інтенсивних операцій. Ви також можете встановити кількість з’єднань, які будуть використані в режимі багатоз’єднання, за допомогою ImapClient.ConnectionsQuantity. Нижче наведений фрагмент коду демонструє використання режиму мультиз’єднання для перелічення повідомлень та порівнює його продуктивність з режимом одного з’єднання.

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

imapClient.SelectFolder("Inbox");
imapClient.ConnectionsQuantity = 5;
imapClient.UseMultiConnection = MultiConnectionMode.Enable;
DateTime multiConnectionModeStartTime = DateTime.Now;
ImapMessageInfoCollection messageInfoCol1 = imapClient.ListMessages(true);
TimeSpan multiConnectionModeTimeSpan = DateTime.Now - multiConnectionModeStartTime;

imapClient.UseMultiConnection = MultiConnectionMode.Disable;
DateTime singleConnectionModeStartTime = DateTime.Now;
ImapMessageInfoCollection messageInfoCol2 = imapClient.ListMessages(true);
TimeSpan singleConnectionModeTimeSpan = DateTime.Now - singleConnectionModeStartTime;
            
double performanceRelation = singleConnectionModeTimeSpan.TotalMilliseconds / multiConnectionModeTimeSpan.TotalMilliseconds;
Console.WriteLine("Performance Relation: " + performanceRelation);

Список повідомлень з підтримкою пагінації

У сценаріях, коли поштовий сервер містить велику кількість повідомлень у поштовій скриньці, часто потрібно вивести список або отримати повідомлення з підтримкою пагінації. API Aspose.Email ImapClient дозволяє отримувати повідомлення з сервера з підтримкою посторінкового перегляду.

///<summary>
/// This example shows the paging support of ImapClient for listing messages from the server
/// Available in Aspose.Email for .NET 6.4.0 and onwards
///</summary>
using (ImapClient client = new ImapClient("host.domain.com", 993, "username", "password"))
{
    try
    {
        int messagesNum = 12;
        int itemsPerPage = 5;
        MailMessage message = null;
        // Create some test messages and append these to server's inbox
        for (int i = 0; i < messagesNum; i++)
        {
            message = new MailMessage(
                "from@domain.com",
                "to@domain.com",
                "EMAILNET-35157 - " + Guid.NewGuid(),
                "EMAILNET-35157 Move paging parameters to separate class");
            client.AppendMessage(ImapFolderInfo.InBox, message);
        }

        // List messages from inbox
        client.SelectFolder(ImapFolderInfo.InBox);
        ImapMessageInfoCollection totalMessageInfoCol = client.ListMessages();
        // Verify the number of messages added
        Console.WriteLine(totalMessageInfoCol.Count);

        ////////////////// RETREIVE THE MESSAGES USING PAGING SUPPORT////////////////////////////////////

        List<ImapPageInfo> pages = new List<ImapPageInfo>();
        PageSettings pageSettings = new PageSettings();
        ImapPageInfo pageInfo = client.ListMessagesByPage(itemsPerPage, 0, pageSettings);
        Console.WriteLine(pageInfo.TotalCount);
        pages.Add(pageInfo);
        while (!pageInfo.LastPage)
        {
            pageInfo = client.ListMessagesByPage(itemsPerPage, pageInfo.NextPage.PageOffset, pageSettings);
            pages.Add(pageInfo);
        }
        int retrievedItems = 0;
        foreach (ImapPageInfo folderCol in pages)
            retrievedItems += folderCol.Items.Count;
        Console.WriteLine(retrievedItems);
    }
    finally
    {
    }
}

Список вкладень повідомлення

Щоб отримати інформацію про вкладення, таку як назва, розмір, без отримання даних вкладення, використайте наступні API:

  • Aspose.Email.Clients.Imap.ImapAttachmentInfo — представляє інформацію про вкладення.
  • Aspose.Email.Clients.Imap.ImapAttachmentInfoCollection — представляє колекцію ImapAttachmentInfo клас.
  • Aspose.Email.Clients.Imap.ListAttachments(int sequenceNumber) — отримує інформацію про кожне вкладення у повідомленні.

Приклад коду з наведеними нижче кроками покаже, як використовувати API:

  1. Викличте ListMessages() метод об’єкта imapClient. Цей метод поверне ImapMessageInfoCollection, що містить інформацію про повідомлення у поштовій скриньці.
  2. Ітеруйте кожне повідомлення у колекції messageInfoCollection за допомогою циклу foreach.
  3. Викличте ListAttachments() метод об’єкта imapClient, передаючи властивість SequenceNumber об’єкта повідомлення як параметр. Цей метод поверне ImapAttachmentInfoCollection, що містить інформацію про вкладення в повідомленні.
  4. Ітеруйте кожне вкладення у колекції attachmentInfoCollection за допомогою циклу foreach.
  5. Внутрішньому циклі ви можете отримати інформацію про кожне вкладення, використовуючи властивості об’єкта attachmentInfo.
var messageInfoCollection = imapClient.ListMessages();
    
foreach (var message in messageInfoCollection)
{
    var attachmentInfoCollection = imapClient.ListAttachments(message.SequenceNumber);

    foreach (var attachmentInfo in attachmentInfoCollection)
    {
        Console.WriteLine("Attachment: {0} (size: {1})", attachmentInfo.Name, attachmentInfo.Size);
    }
}

Отримання та збереження повідомлень

Отримати повідомлення з сервера

The ImapClient клас може отримувати повідомлення з IMAP-сервера та зберігати їх у форматі EML на локальний диск. Для збереження повідомлень на диск необхідно виконати наступні кроки:

  1. Створіть екземпляр ImapClient клас.
  2. Вкажіть ім’я хоста, порт, ім’я користувача та пароль у ImapClient конструктор.
  3. Виберіть папку за допомогою SelectFolder() метод.
  4. Викличте ListMessages метод для отримання ImapMessageInfoCollection об’єкт.
  5. Ітеруйте через ImapMessageInfoCollection колекція, викличте SaveMessage() метод і вказати шлях до виводу та ім’я файлу.

Наведений нижче фрагмент коду показує, як отримати листи з сервера та зберегти їх.

// Select the inbox folder and Get the message info collection
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection list = client.ListMessages();

// Download each message
for (int i = 0; i < list.Count; i++)
{
    // Save the EML file locally
    client.SaveMessage(list[i].UniqueId, dataDir + list[i].UniqueId + ".eml");
}

Отримати повідомлення у порядку спадання

Aspose.Email надає ImapClient.ListMessagesByPage метод, який перелічує повідомлення з підтримкою пагінації. Деякі перегрузки ImapClient.ListMessagesByPage приймає PageSettings як параметр. PageSettings надає AscendingSorting властивість, яка при встановленні в false повертає листи у порядку спадання.

Наведений нижче приклад коду демонструє використання AscendingSorting властивість PageSettings клас для зміни порядку листів.

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

PageSettings pageSettings = new PageSettings { AscendingSorting = false };
ImapPageInfo pageInfo = imapClient.ListMessagesByPage(5, pageSettings);
ImapMessageInfoCollection messages = pageInfo.Items;

foreach (ImapMessageInfo message in messages)
{
    Console.WriteLine(message.Subject + " -> " + message.Date.ToString());
}

Зберегти повідомлення у форматі MSG

Щоб зберегти листи у форматі MSG, ImapClient.FetchMessage() метод потрібно викликати. Він повертає повідомлення у екземплярі MailMessage клас. The MailMessage.Save() метод можна викликати для збереження повідомлення у форматі MSG. Наведений нижче фрагмент коду показує, як зберігати повідомлення у форматі MSG.

// The path to the file directory.
string dataDir = RunExamples.GetDataDir_IMAP();

// Create an imapclient with host, user and password
ImapClient client = new ImapClient("localhost", "user", "password");

// Select the inbox folder and Get the message info collection
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection list = client.ListMessages();

// Download each message
for (int i = 0; i < list.Count; i++)
{
    // Save the message in MSG format
    MailMessage message = client.FetchMessage(list[i].UniqueId);
    message.Save(dataDir + list[i].UniqueId + "_out.msg", SaveOptions.DefaultMsgUnicode);
}

Групувати отримані повідомлення

ImapClient надає FetchMessages метод, який приймає ітерабельну колекцію номерів послідовності або унікальних ідентифікаторів і повертає список MailMessage. Наступний фрагмент коду демонструє використання FetchMessages метод для отримання повідомлень за номерами послідовності та унікальним ідентифікатором.

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages();
Console.WriteLine("ListMessages Count: " + messageInfoCol.Count);
int[] sequenceNumberAr = messageInfoCol.Select((ImapMessageInfo mi) => mi.SequenceNumber).ToArray();
string[] uniqueIdAr = messageInfoCol.Select((ImapMessageInfo mi) => mi.UniqueId).ToArray();

IList<MailMessage> fetchedMessagesBySNumMC = imapClient.FetchMessages(sequenceNumberAr);
Console.WriteLine("FetchMessages-sequenceNumberAr Count: " + fetchedMessagesBySNumMC.Count);

IList<MailMessage> fetchedMessagesByUidMC = imapClient.FetchMessages(uniqueIdAr);
Console.WriteLine("FetchMessages-uniqueIdAr Count: " + fetchedMessagesByUidMC.Count);

Отримати папки та читати повідомлення рекурсивно

У цій статті більшість ImapClient функції використовуються для створення програми, яка рекурсивно перераховує всі папки та підпапки з IMAP‑серверу. Вона також зберігає повідомлення в кожній папці та підпапці у форматі MSG на локальному диску. На диску папки та повідомлення створюються та зберігаються в тій самій ієрархічній структурі, що й на IMAP‑сервері. Нижче наведено фрагмент коду, який показує, як отримати повідомлення та інформацію про підпапки рекурсивно.

public static void Run()
{
    // Create an instance of the ImapClient class
    ImapClient client = new ImapClient();

    // Specify host, username, password, Port and SecurityOptions for your client
    client.Host = "imap.gmail.com";
    client.Username = "your.username@gmail.com";
    client.Password = "your.password";
    client.Port = 993;
    client.SecurityOptions = SecurityOptions.Auto;
    try
    {
        // The root folder (which will be created on disk) consists of host and username
        string rootFolder = client.Host + "-" + client.Username;

        // Create the root folder and List all the folders from IMAP server
        Directory.CreateDirectory(rootFolder);
        ImapFolderInfoCollection folderInfoCollection = client.ListFolders();
        foreach (ImapFolderInfo folderInfo in folderInfoCollection)
        {
            // Call the recursive method to read messages and get sub-folders
            ListMessagesInFolder(folderInfo, rootFolder, client);
        }
        // Disconnect to the remote IMAP server
        client.Dispose();
    }
    catch (Exception ex)
    {
        Console.Write(Environment.NewLine + ex);
    }

    Console.WriteLine(Environment.NewLine + "Downloaded messages recursively from IMAP server.");
}

/// Recursive method to get messages from folders and sub-folders
private static void ListMessagesInFolder(ImapFolderInfo folderInfo, string rootFolder, ImapClient client)
{
    // Create the folder in disk (same name as on IMAP server)
    string currentFolder = RunExamples.GetDataDir_IMAP();
    Directory.CreateDirectory(currentFolder);

    // Read the messages from the current folder, if it is selectable
    if (folderInfo.Selectable)
    {
        // Send status command to get folder info
        ImapFolderInfo folderInfoStatus = client.GetFolderInfo(folderInfo.Name);
        Console.WriteLine(folderInfoStatus.Name + " folder selected. New messages: " + folderInfoStatus.NewMessageCount + ", Total messages: " + folderInfoStatus.TotalMessageCount);

        // Select the current folder and List messages
        client.SelectFolder(folderInfo.Name);
        ImapMessageInfoCollection msgInfoColl = client.ListMessages();
        Console.WriteLine("Listing messages....");
        foreach (ImapMessageInfo msgInfo in msgInfoColl)
        {
            // Get subject and other properties of the message
            Console.WriteLine("Subject: " + msgInfo.Subject);
            Console.WriteLine("Read: " + msgInfo.IsRead + ", Recent: " + msgInfo.Recent + ", Answered: " + msgInfo.Answered);

            // Get rid of characters like ? and :, which should not be included in a file name and Save the message in MSG format
            string fileName = msgInfo.Subject.Replace(":", " ").Replace("?", " ");
            MailMessage msg = client.FetchMessage(msgInfo.SequenceNumber);
            msg.Save(currentFolder + "\\" + fileName + "-" + msgInfo.SequenceNumber + ".msg", SaveOptions.DefaultMsgUnicode);
        }
        Console.WriteLine("============================\n");
    }
    else
    {
        Console.WriteLine(folderInfo.Name + " is not selectable.");
    }

    try
    {
        // If this folder has sub-folders, call this method recursively to get messages
        ImapFolderInfoCollection folderInfoCollection = client.ListFolders(folderInfo.Name);
        foreach (ImapFolderInfo subfolderInfo in folderInfoCollection)
        {
            ListMessagesInFolder(subfolderInfo, rootFolder, client);
        }
    }
    catch (Exception) { }            
}

Обробка спеціальної інформації повідомлення

Отримати додаткові параметри як інформацію резюме

using (ImapClient client = new ImapClient("host.domain.com", "username", "password"))
{
    MailMessage message = new MailMessage("from@domain.com", "to@doman.com", "EMAILNET-38466 - " + Guid.NewGuid().ToString(), "EMAILNET-38466 Add extra parameters for UID FETCH command");

    // append the message to the server
    string uid = client.AppendMessage(message);

    // wait for the message to be appended
    Thread.Sleep(5000);

    // Define properties to be fetched from server along with the message
    string[] messageExtraFields = new string[] { "X-GM-MSGID", "X-GM-THRID" };

    // retreive the message summary information using it's UID
    ImapMessageInfo messageInfoUID = client.ListMessage(uid, messageExtraFields);

    // retreive the message summary information using it's sequence number
    ImapMessageInfo messageInfoSeqNum = client.ListMessage(1, messageExtraFields);

    // List messages in general from the server based on the defined properties
    ImapMessageInfoCollection messageInfoCol = client.ListMessages(messageExtraFields);

    ImapMessageInfo messageInfoFromList = messageInfoCol[0];

    // verify that the parameters are fetched in the summary information
    foreach (string paramName in messageExtraFields)
    {
        Console.WriteLine(messageInfoFromList.ExtraParameters.ContainsKey(paramName));
        Console.WriteLine(messageInfoUID.ExtraParameters.ContainsKey(paramName));
        Console.WriteLine(messageInfoSeqNum.ExtraParameters.ContainsKey(paramName));
    }
}

Отримати інформацію заголовка List-Unsubscribe

Заголовок List-Unsubscribe містить URL для відписки від електронних розсилок, наприклад реклами, новинних листів тощо. Щоб отримати заголовок List-Unsubscribe, використайте ListUnsubscribe властивість ImapMessageInfo клас. Наведений нижче приклад демонструє використання ListUnsubscribe властивість для отримання заголовка List-Unsubscribe.

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages();
foreach (ImapMessageInfo imapMessageInfo in messageInfoCol)
{
    Console.WriteLine("ListUnsubscribe Header: " + imapMessageInfo.ListUnsubscribe);
}