Извличане и изброяване на имейли от IMAP сървър

Извличане и изброяване на съобщения

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

При извличане и обработка на имейл съобщения можете да получите подробна идентификационна информация, като последователни номера и уникални ID‑та, като използвате следните възможности, предоставени от последната версия на Aspose.Email за .NET:

Aspose.Email.ImapMessageInfo клас: Представлява идентификационната информация за съобщение в IMAP пощенска кутия.

ImapMessageInfo.SequenceNumber свойство: Получава последователния номер на съобщението.

ImapMessageInfo.UniqueId свойство: Получава уникалния идентификатор на съобщението.

Aspose.Email.MailMessage.ItemId свойство: Представлява допълнителна идентификационна информация за съобщението в пощенската кутия.

Следният кодов фрагмент демонстрира как да получите идентификационна информация за съобщения в IMAP пощенска кутия:

  1. Създайте инстанция на ImapClient клас, като предоставите необходимите параметри като хост на IMAP сървъра, порт, имейл адрес, парола и опции за сигурност.
  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 ID-та на съобщения от сървъра

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

Изброяване на съобщения с поддръжка на странициране

В сценарии, при които имейл сървърът съдържа голям брой съобщения в пощенската кутия, често е желателно да се изброяват или извличат съобщенията с поддръжка на странициране. Aspose.Email API‑тe 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);
    }
}

Изтегляне и запазване на съобщения

Извличане на съобщения от сървъра

Този ImapClient клас може да извлича съобщения от IMAP сървър и да ги запазва във формат EML на локален диск. Необходими са следните стъпки за запазване на съобщенията на диск:

  1. Създайте инстанция на ImapClient клас.
  2. Посочете име на хост, порт, потребителско име и парола в ImapClient  constructor.
  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 клас. Този 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);
}