Hämta och lista e‑post från IMAP‑server

Hämta och lista meddelanden

Hur man får identifieringsinformation för meddelanden i en brevlåda

När du hämtar och bearbetar e‑postmeddelanden kan du få detaljerad identifieringsinformation, såsom sekvensnummer och unika ID:n, med hjälp av följande funktioner som tillhandahålls av den senaste versionen av Aspose.Email för .NET:

Aspose.Email.ImapMessageInfo klass: Representerar identifieringsinformationen om ett meddelande i en IMAP‑brevlåda.

ImapMessageInfo.SequenceNumber egenskap: Hämtar meddelandets sekvensnummer.

ImapMessageInfo.UniqueId egenskap: Hämtar meddelandets unika identifierare.

Aspose.Email.MailMessage.ItemId egenskap: Representerar ytterligare identifieringsinformation om meddelandet i brevlådan.

Följande kodsnutt demonstrerar hur man får identifieringsinformation för meddelanden i en IMAP‑brevlåda:

  1. Skapa en instans av ImapClient klass genom att ange nödvändiga parametrar såsom IMAP‑servervärd, port, e‑postadress, lösenord och säkerhetsalternativ.
  2. Använd ListMessages metod för att hämta en lista med meddelanden från "INBOX"‑mappen. Begränsa listan till de fem första meddelandena med metoden Take(5).
  3. Extrahera sekvensnumren för de listade meddelandena genom att använda SequenceNumber egenskap för varje meddelande.
  4. Använd FetchMessages metod för att hämta fullständiga detaljer för meddelandena från servern, med hjälp av sekvensnumren som erhölls i föregående steg.
  5. Iterera genom de hämtade meddelandena och för varje meddelande hämta och visa följande information:
  • Meddelande‑sekvensnumret.
  • Egenskapen ItemId.SequenceNumber.
  • Meddelandets ämne.
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}");
    }
}

Lista MIME‑meddelande‑ID:n från servern

ImapMessageInfo tillhandahåller MIME MessageId för meddelandeidentifiering utan att extrahera hela meddelandet. Följande kodsnutt visar hur du listar 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);
}

Lista meddelanden från servern

Aspose.Email tillhandahåller en överlagrad variant med 2 medlemmar av ListMessages() för att hämta ett specificerat antal meddelanden baserat på en fråga. Följande kodsnutt visar hur man listar meddelanden.


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

Lista meddelanden rekursivt

IMAP‑protokollet stödjer rekursiv listning av meddelanden från en brevlådemapp. Detta hjälper även till att lista meddelanden från undermappar i en mapp. Följande kodsnutt visar hur du listar meddelanden rekursivt.

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

Lista meddelanden med MultiConnection

ImapClient ger en UseMultiConnection egenskap som kan användas för att skapa flera anslutningar för tunga operationer. Du kan också ange antalet anslutningar som ska användas under multikonnectionsläget genom att använda ImapClient.ConnectionsQuantity. Följande kodsnutt demonstrerar användning av multikonnectionsläge för att lista meddelanden och jämför dess prestanda med enkelnanslutningsläge.

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

Lista meddelanden med sidningsstöd

I scenarier där e-postservern innehåller ett stort antal meddelanden i brevlådan är det ofta önskvärt att lista eller hämta meddelandena med stöd för sidindelning. Aspose.Email API:s ImapClient låter dig hämta meddelandena från servern med stöd för sidindelning.

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

Lista meddelandebilagor

För att få information om bilagor såsom namn, storlek utan att hämta bilagedatan, prova följande API:er:

  • Aspose.Email.Clients.Imap.ImapAttachmentInfo – Representerar information om en bilaga.
  • Aspose.Email.Clients.Imap.ImapAttachmentInfoCollection – Representerar en samling av ImapAttachmentInfo klass.
  • Aspose.Email.Clients.Imap.ListAttachments(int sequenceNumber) – Hämtar information för varje bilaga i ett meddelande.

Kodexemplet med stegen nedan visar hur du använder API:erna:

  1. Anropa ListMessages() metod på imapClient-objektet. Denna metod returnerar en ImapMessageInfoCollection som innehåller information om meddelandena i brevlådan.
  2. Iterera genom varje meddelande i messageInfoCollection med en foreach-loop.
  3. Anropa ListAttachments() metod på imapClient-objektet, där SequenceNumber-egenskapen för meddelandeobjektet skickas som parameter. Denna metod returnerar en ImapAttachmentInfoCollection som innehåller information om bilagorna i meddelandet.
  4. Iterera genom varje bilaga i attachmentInfoCollection med en foreach-loop.
  5. Inom den inre loopen kan du komma åt informationen om varje bilaga genom att använda egenskaperna i objektet 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);
    }
}

Hämta och spara meddelanden

Hämta meddelanden från servern

Den ImapClient klassen kan hämta meddelanden från en IMAP‑server och spara dem i EML‑format på en lokal disk. Följande steg krävs för att spara meddelandena till disk:

  1. Skapa en instans av ImapClient klass.
  2. Ange ett värdnamn, port, användarnamn och lösenord i ImapClient constructor.
  3. Välj mappen med hjälp av SelectFolder() metod.
  4. Anropa ListMessages metod för att få ImapMessageInfoCollection objekt.
  5. Iterera igenom ImapMessageInfoCollection samling, anropa SaveMessage() metod och ange utdatavägen samt filnamnet.

Följande kodavsnitt visar hur du hämtar e‑postmeddelanden från en server och sparar dem.

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

Hämta meddelanden i fallande ordning

Aspose.Email tillhandahåller ImapClient.ListMessagesByPage metod som listar meddelanden med stöd för sidindelning. Vissa överlagringar av ImapClient.ListMessagesByPage accept PageSettings som en parameter. PageSettings tillhandahåller en AscendingSorting egenskap som, när den sätts till false, returnerar e‑post i fallande ordning.

Följande exempelkod demonstrerar användningen av AscendingSorting egenskap hos PageSettings klass för att ändra ordningen på e‑postmeddelanden.

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

Spara meddelanden i MSG-format

För att spara e‑post i MSG-format, ImapClient.FetchMessage() metoden måste anropas. Den returnerar meddelandet i en instans av MailMessage klass. Den MailMessage.Save() metoden kan sedan anropas för att spara meddelandet i MSG. Följande kodavsnitt visar hur du sparar meddelanden i MSG‑format.

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

Gruppera hämtade meddelanden

ImapClient ger en FetchMessages metod som accepterar en iterabel av sekvensnummer eller unika ID och returnerar en lista med MailMessage. Följande kodsnutt demonstrerar användningen av FetchMessages metod för att hämta meddelanden med sekvensnummer och unikt 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);

Hämta mappar och läsa meddelanden rekursivt

I den här artikeln, de flesta av ImapClient Funktionerna används för att skapa en applikation som listar alla mappar och undermappar rekursivt från en IMAP-server. Den sparar också meddelandena i varje mapp och undermapp i MSG-format på en lokal disk. På disken skapas och sparas mappar och meddelanden i samma hierarkiska struktur som på IMAP-servern. Följande kodsnutt visar hur du hämtar meddelanden och information om undermappar rekursivt.

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

Hantera speciell meddelandeinformation

Hämta extra parametrar som sammanfattningsinformation

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

Hämta List-Unsubscribe-headerinformation

List-Unsubscribe‑rubriken innehåller URL:en för att avregistrera sig från e‑postlistor, t.ex. annonser, nyhetsbrev osv. För att hämta List-Unsubscribe‑rubriken, använd ListUnsubscribe egenskap hos ImapMessageInfo klass. Följande exempel visar användningen av ListUnsubscribe egenskap för att hämta List-Unsubscribe‑rubriken.

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