Načíst a vypsat e‑maily z IMAP serveru

Načítání a výpis zpráv

Jak získat identifikační informace o zprávách v poštovní schránce

Při získávání a zpracování e‑mailových zpráv můžete získat podrobné identifikační informace, jako jsou sekvenční čísla a unikátní ID, pomocí následujících funkcí poskytovaných nejnovější verzí Aspose.Email pro .NET:

Aspose.Email.ImapMessageInfo třída: představuje identifikační informace o zprávě v IMAP poštovní schránce.

ImapMessageInfo.SequenceNumber vlastnost: získává sekvenční číslo zprávy.

ImapMessageInfo.UniqueId vlastnost: získává unikátní identifikátor zprávy.

Aspose.Email.MailMessage.ItemId vlastnost: představuje další identifikační informace o zprávě v poštovní schránce.

Následující úryvek kódu demonstruje, jak získat identifikační informace o zprávách v IMAP poštovní schránce:

  1. Vytvořte instanci ImapClient třída poskytnutím nezbytných parametrů, jako je hostitel IMAP serveru, port, e‑mailová adresa, heslo a bezpečnostní možnosti.
  2. Použijte ListMessages metoda pro získání seznamu zpráv ze složky "INBOX". Omezte seznam na prvních pět zpráv pomocí metody Take(5).
  3. Extrahujte sekvenční čísla uvedených zpráv pomocí SequenceNumber vlastnost každé zprávy.
  4. Použijte FetchMessages metoda pro načtení úplných detailů zpráv ze serveru pomocí sekvenčních čísel získaných v předchozím kroku.
  5. Procházejte načtené zprávy a pro každou zprávu načtěte a zobrazte následující informace:
  • Sekvenční číslo zprávy.
  • Vlastnost ItemId.SequenceNumber.
  • Předmět zprávy.
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}");
    }
}

Vypsat MIME ID zpráv ze serveru

ImapMessageInfo poskytuje MIME MessageId pro identifikaci zprávy bez extrakce celé zprávy. Následující úryvek kódu ukazuje, jak vypsat 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);
}

Seznam zpráv ze serveru

Aspose.Email poskytuje 2‑člennou přetíženou variantu ListMessages() pro načtení určeného počtu zpráv podle dotazu. Následující úryvek kódu ukazuje, jak vypsat zprávy.


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

Vypsat zprávy rekurzivně

Protokol IMAP podporuje rekurzivní výpis zpráv ze složky poštovní schránky. To pomáhá také vypisovat zprávy z podadresářů složky. Následující úryvek kódu ukazuje, jak vypisovat zprávy rekurzivně.

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

Vypsat zprávy s více spojeními

ImapClient poskytuje UseMultiConnection vlastnost, která může být použita k vytvoření více spojení pro náročné operace. Počet spojení, která budou použita během režimu multipojení, můžete také nastavit pomocí ImapClient.ConnectionsQuantity. Následující úryvek kódu demonstruje použití režimu multipojení pro výpis zpráv a porovnává jeho výkon s režimem jednopojízdného připojení.

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

Vypsat zprávy s podporou stránkování

Ve scénářích, kdy e‑mailový server obsahuje velké množství zpráv v poštovní schránce, je často požadováno vypsat nebo načíst zprávy s podporou stránkování. Aspose.Email API ImapClient umožňuje získat zprávy ze serveru s podporou stránkování.

///<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
    {
    }
}

Seznam příloh zprávy

Chcete‑li získat informace o přílohách, jako je název či velikost, aniž byste načítali data přílohy, vyzkoušejte následující API:

  • Aspose.Email.Clients.Imap.ImapAttachmentInfo – představuje informace o příloze.
  • Aspose.Email.Clients.Imap.ImapAttachmentInfoCollection – představuje kolekci ImapAttachmentInfo třída.
  • Aspose.Email.Clients.Imap.ListAttachments(int sequenceNumber) – získá informace o každé příloze ve zprávě.

Ukázkový kód s následujícími kroky vám ukáže, jak používat API:

  1. Zavolejte ListMessages() metoda na objektu imapClient. Tato metoda vrátí ImapMessageInfoCollection obsahující informace o zprávách v poštovní schránce.
  2. Procházejte každou zprávu v kolekci messageInfoCollection pomocí smyčky foreach.
  3. Zavolejte ListAttachments() metoda na objektu imapClient, která předává vlastnost SequenceNumber objektu message jako parametr. Tato metoda vrátí ImapAttachmentInfoCollection obsahující informace o přílohách zprávy.
  4. Procházejte každou přílohu ve sbírce attachmentInfoCollection pomocí smyčky foreach.
  5. Vnitřní smyčkou můžete získat informace o každé příloze pomocí vlastností objektu 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);
    }
}

Stahování a ukládání zpráv

Načíst zprávy ze serveru

The ImapClient třída může načíst zprávy z IMAP serveru a uložit je ve formátu EML na lokální disk. Následující kroky jsou potřeba k uložení zpráv na disk:

  1. Vytvořte instanci ImapClient třída.
  2. Zadejte název hostitele, port, uživatelské jméno a heslo v ImapClient konstruktéru.
  3. Vyberte složku pomocí SelectFolder() metoda.
  4. Zavolejte ListMessages metodu pro získání ImapMessageInfoCollection objektu.
  5. Iterujte přes ImapMessageInfoCollection kolekci, zavolejte SaveMessage() metodu a poskytnout výstupní cestu a název souboru.

Následující úryvek kódu ukazuje, jak načíst e‑mailové zprávy ze serveru a uložit je.

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

Načíst zprávy v sestupném pořadí

Aspose.Email poskytuje ImapClient.ListMessagesByPage metoda, která vypisuje zprávy s podporou stránkování. Některé přetížení ImapClient.ListMessagesByPage přijímá PageSettings jako parametr. PageSettings poskytuje AscendingSorting vlastnost, která při nastavení na false vrací e‑maily v sestupném pořadí.

Následující ukázkový kód demonstruje použití AscendingSorting vlastnost třídy PageSettings třída pro změnu pořadí e‑mailů.

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

Uložit zprávy ve formátu MSG

Pro uložení e‑mailů ve formátu MSG, ImapClient.FetchMessage() metodu je nutné zavolat. Vrací zprávu v instanci MailMessage třída. The MailMessage.Save() metoda může být poté zavolána k uložení zprávy do MSG. Následující úryvek kódu ukazuje, jak uložit zprávy ve formátu 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);
}

Seskupit načtené zprávy

ImapClient poskytuje FetchMessages metoda, která přijímá iterovatel sekvenčních čísel nebo unikátní ID a vrací seznam MailMessage. Následující úryvek kódu demonstruje použití FetchMessages metoda pro načtení zpráv podle sekvenčních čísel a unikátního ID.

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

Načíst složky a číst zprávy rekurzivně

V tomto článku je většina ImapClient funkce se používají k vytvoření aplikace, která rekurzivně vypisuje všechny složky a podsložky z IMAP serveru. Zprávy v každé složce a podsložce ukládá ve formátu MSG na lokální disk. Na disku jsou složky a zprávy vytvořeny a uloženy ve stejné hierarchické struktuře jako na IMAP serveru. Následující úryvek kódu ukazuje, jak získat zprávy a informace o podsložkách rekurzivně.

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) { }            
}

Zpracování speciálních informací o zprávě

Získat dodatečné parametry jako souhrnné informace

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

Získat informace z hlavičky List-Unsubscribe

Hlavička List-Unsubscribe obsahuje URL pro odhlášení z e‑mailových seznamů, např. reklamy, newslettery atd. Pro získání hlavičky List-Unsubscribe použijte ListUnsubscribe vlastnost třídy ImapMessageInfo třída. Následující příklad ukazuje použití ListUnsubscribe vlastnost pro získání hlavičky 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);
}