Recupera e Elenca Email dal Server IMAP

Recupero e Elenco dei Messaggi

Come Ottenere Informazioni di Identificazione per i Messaggi in una Casella

Durante il recupero e l’elaborazione dei messaggi email, puoi ottenere informazioni di identificazione dettagliate, come numeri di sequenza e ID unici, usando le seguenti funzionalità offerte dall’ultima versione di Aspose.Email per .NET:

Aspose.Email.ImapMessageInfo classe: Rappresenta le informazioni di identificazione su un messaggio in una casella IMAP.

ImapMessageInfo.SequenceNumber proprietà: Recupera il numero di sequenza del messaggio.

ImapMessageInfo.UniqueId proprietà: Recupera l’identificatore univoco del messaggio.

Aspose.Email.MailMessage.ItemId proprietà: Rappresenta informazioni aggiuntive di identificazione sul messaggio all’interno della casella.

Il seguente frammento di codice dimostra come ottenere informazioni di identificazione per i messaggi in una casella IMAP:

  1. Crea un’istanza di ImapClient classe fornendo i parametri necessari come host del server IMAP, porta, indirizzo email, password e opzioni di sicurezza.
  2. Usa il ListMessages metodo per recuperare una lista di messaggi dalla cartella "INBOX". Limita la lista ai primi cinque messaggi usando il metodo Take(5).
  3. Estrai i numeri di sequenza dei messaggi elencati usando il SequenceNumber proprietà di ciascun messaggio.
  4. Usa il FetchMessages metodo per recuperare i dettagli completi dei messaggi dal server, usando i numeri di sequenza ottenuti nel passaggio precedente.
  5. Scorri i messaggi recuperati e per ciascun messaggio, recupera e visualizza le seguenti informazioni:
  • Il numero di sequenza del messaggio.
  • La proprietà ItemId.SequenceNumber.
  • L’oggetto del messaggio.
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}");
    }
}

Elenca ID dei Messaggi MIME dal Server

ImapMessageInfo fornisce il MIME MessageId per l’identificazione del messaggio senza estrarre l’intero messaggio. Il seguente frammento di codice mostra come elencare il 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);
}

Elenca i messaggi dal server

Aspose.Email fornisce una variante sovraccarica a 2 membri di ListMessages() per recuperare un numero specifico di messaggi basato su una query. Il seguente frammento di codice mostra come elencare i Messaggi.


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

Elenca i messaggi ricorsivamente

Il protocollo IMAP supporta l’elenco dei messaggi in modo ricorsivo da una cartella di casella. Questo aiuta a elencare anche i messaggi dalle sottocartelle. Il seguente frammento di codice mostra come elencare i messaggi ricorsivamente.

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

Elenca messaggi con MultiConnection

ImapClient fornisce un UseMultiConnection proprietà che può essere usata per creare più connessioni per operazioni intensive. È inoltre possibile impostare il numero di connessioni da utilizzare durante la modalità multiconnessione usando ImapClient.ConnectionsQuantity. Il seguente frammento di codice dimostra l’uso della modalità multiconnessione per elencare i messaggi e confronta le sue prestazioni con la modalità a singola connessione.

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

Elenca messaggi con supporto alla paginazione

In scenari in cui il server di posta contiene un gran numero di messaggi nella casella di posta, è spesso desiderabile elencare o recuperare i messaggi con supporto di paginazione. Le API di Aspose.Email ImapClient ti consente di recuperare i messaggi dal server con supporto alla paginazione.

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

Elenca gli allegati dei messaggi

Per ottenere informazioni sugli allegati come nome, dimensione senza recuperare i dati dell’allegato, prova le seguenti API:

  • Aspose.Email.Clients.Imap.ImapAttachmentInfo - Rappresenta le informazioni di un allegato.
  • Aspose.Email.Clients.Imap.ImapAttachmentInfoCollection - Rappresenta una raccolta di ImapAttachmentInfo classe.
  • Aspose.Email.Clients.Imap.ListAttachments(int sequenceNumber) - Ottiene informazioni per ciascun allegato in un messaggio.

Il campione di codice con i passaggi seguenti ti mostrerà come utilizzare le API:

  1. Chiama il ListMessages() Metodo sull’oggetto imapClient. Questo metodo restituirà una ImapMessageInfoCollection contenente le informazioni sui messaggi nella casella di posta.
  2. Itera attraverso ogni messaggio nella collection messageInfoCollection usando un ciclo foreach.
  3. Chiama il ListAttachments() Metodo sull’oggetto imapClient, passando la proprietà SequenceNumber dell’oggetto messaggio come parametro. Questo metodo restituirà una ImapAttachmentInfoCollection contenente le informazioni sugli allegati del messaggio.
  4. Itera attraverso ogni allegato nella collection attachmentInfoCollection usando un ciclo foreach.
  5. All’interno del ciclo interno, è possibile accedere alle informazioni di ogni allegato utilizzando le proprietà dell’oggetto 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);
    }
}

Recupero e salvataggio dei messaggi

Recupera messaggi dal server

Il ImapClient la classe può recuperare messaggi da un server IMAP e salvare i messaggi in formato EML su disco locale. I passaggi seguenti sono necessari per salvare i messaggi su disco:

  1. Crea un’istanza di ImapClient classe.
  2. Specifica un nome host, porta, nome utente e password nell’ImapClient constructor.
  3. Seleziona la cartella usando SelectFolder() metodo.
  4. Chiama il ListMessages metodo per ottenere il ImapMessageInfoCollection oggetto.
  5. Iterare attraverso il ImapMessageInfoCollection collezione, chiamare il SaveMessage() metodo e fornire il percorso di output e il nome file.

Il seguente frammento di codice mostra come recuperare i messaggi email da un server e salvarli.

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

Recupera i messaggi in ordine discendente

Aspose.Email fornisce ImapClient.ListMessagesByPage metodo che elenca i messaggi con supporto alla paginazione. Alcune sovraccarichi di ImapClient.ListMessagesByPage accetta PageSettings come parametro. PageSettings fornisce un AscendingSorting proprietà che, quando impostata su false, restituisce le email in ordine discendente.

Il seguente codice di esempio dimostra l’uso di AscendingSorting proprietà del PageSettings classe per modificare l’ordine delle email.

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

Salva messaggi in formato MSG

Per salvare le email in formato MSG, il ImapClient.FetchMessage() il metodo deve essere chiamato. Restituisce il messaggio in un’istanza di MailMessage classe. Il MailMessage.Save() il metodo può quindi essere chiamato per salvare il messaggio in MSG. Il seguente frammento di codice mostra come salvare i messaggi in formato 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);
}

Raggruppa i messaggi recuperati

ImapClient fornisce un FetchMessages metodo che accetta un iterabile di Numeri di sequenza o ID unico e restituisce una lista di MailMessage. Il seguente frammento di codice dimostra l’uso del FetchMessages metodo per recuperare messaggi per Numero di sequenza e ID unico.

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

Recupera cartelle e leggi i messaggi ricorsivamente

In questo articolo, la maggior parte dei ImapClient Le funzionalità sono usate per creare un’applicazione che elenca tutte le cartelle e sottocartelle in modo ricorsivo da un server IMAP. Salva anche i messaggi in ogni cartella e sottocartella in formato MSG su disco locale. Sul disco, cartelle e messaggi sono creati e salvati nella stessa struttura gerarchica del server IMAP. Il frammento di codice seguente mostra come ottenere i messaggi e le informazioni delle sottocartelle in modo ricorsivo.

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

Gestione di informazioni speciali del messaggio

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

Ottieni le informazioni dell’intestazione List-Unsubscribe

L’intestazione List-Unsubscribe contiene l’URL per annullare l’iscrizione alle liste email, ad es. pubblicità, newsletter, ecc. Per ottenere l’intestazione List-Unsubscribe, utilizzare il ListUnsubscribe proprietà del ImapMessageInfo classe. L’esempio seguente mostra l’uso di ListUnsubscribe proprietà per ottenere l’intestazione 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);
}