Come Stabilire Connessioni IMAP in C#

Elencare le Estensioni del Server IMAP

di Aspose.Email ImapClient ti permette di recuperare le estensioni del server supportate, come IDLE, UNSELECT, QUOTA, ecc. Questo aiuta a identificare la disponibilità di un’estensione prima di utilizzare il client per quella specifica funzionalità. Il GetCapabilities() il metodo restituisce i tipi di estensione supportati sotto forma di array di stringhe. Il seguente frammento di codice mostra come recuperare le estensioni.

Connessione IMAP Standard

Il ImapClient la classe permette alle applicazioni di gestire caselle di posta IMAP usando il protocollo IMAP. Il ImapClient la classe è usata per connettersi a server di posta IMAP e gestire le email nelle cartelle IMAP. Per connettersi a un server IMAP

  1. Crea un’istanza di ImapClient classe.
  2. Specifica hostname, nome utente e password nel Costruttore ImapClient.

Nota, le restrizioni sulla password devono soddisfare i requisiti del server. Il client email non aggiunge restrizioni sulla password.

Una volta che ImapClient l’istanza è avviata, la successiva chiamata a qualsiasi operazione usando questa istanza connetterà al server. Il seguente frammento di codice mostra come connettersi a un server IMAP usando i passaggi sopra.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an imapclient with host, user and password
ImapClient client = new ImapClient("localhost", "user", "password");

Connessione IMAP con SSL Abilitato

Connessione con Server IMAP descritto come connettersi a un server IMAP in quattro semplici passaggi:

  1. Crea un’istanza di ImapClient classe.
  2. Specifica hostname, nome utente e password.
  3. Specifica la porta.
  4. Specifica le Opzioni di Sicurezza.

Il processo per connettersi a un server IMAP con SSL abilitato è simile ma richiede di impostare alcune altre proprietà:

Il seguente frammento di codice mostra come

  1. Imposta nome utente, password e porta.
  2. Imposta l’opzione di sicurezza.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an instance of the ImapClient class
ImapClient client = new ImapClient("imap.domain.com", 993, "user@domain.com", "pwd");
            
// Set the security mode to implicit
client.SecurityOptions = SecurityOptions.SSLImplicit;

Configurazione Connessione Proxy

Connessione al server tramite proxy

I server proxy sono comunemente usati per comunicare con l’esterno. In questi casi, i client di posta non possono comunicare su Internet senza specificare l’indirizzo del proxy. Aspose.Email supporta le versioni 4, 4a e 5 del protocollo proxy SOCKS. Questo articolo fornisce un esempio funzionante di accesso alla casella di posta usando un server proxy di posta. Per accedere alla casella tramite un server proxy:

  1. Inizializza SocksProxy con le informazioni richieste, ovvero indirizzo proxy, porta e versione SOCKS.
  2. Inizializza ImapClient con l’indirizzo host, nome utente, password e eventuali altre impostazioni.
  3. Imposta il client SocksProxy proprietà del client a SocksProxy oggetto creato sopra.

Il seguente frammento di codice mostra come recuperare la casella di posta tramite un server proxy.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect and log in to IMAP and set SecurityOptions
ImapClient client = new ImapClient("imap.domain.com", "username", "password");
client.SecurityOptions = SecurityOptions.Auto;
            
string proxyAddress = "192.168.203.142"; // proxy address
int proxyPort = 1080; // proxy port
SocksProxy proxy = new SocksProxy(proxyAddress, proxyPort, SocksVersion.SocksV5);

// Set the proxy
client.Proxy = proxy;
           
try
{
    client.SelectFolder("Inbox");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

Connessione al server tramite proxy HTTP

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
HttpProxy proxy = new HttpProxy("18.222.124.59", 8080);
using (ImapClient client = new ImapClient("imap.domain.com", "username", "password"))
{
    client.Proxy = proxy;
    client.SelectFolder("Inbox");
}

Connessione in Modalità Soltanto Lettura

Il ImapClient la classe fornisce un ReadOnly proprietà che, quando impostata su true, indica che non devono essere apportate modifiche allo stato permanente della casella di posta. Il seguente esempio di codice dimostra l’uso di ImapClient.ReadOnly proprietà. Ottiene il conteggio dei messaggi non letti, poi recupera un messaggio e poi ottiene nuovamente il conteggio dei messaggi non letti in modalità di sola lettura. Il conteggio dei messaggi non letti rimane lo stesso, indicando che lo stato permanente della casella di posta non è stato modificato.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

ImapQueryBuilder imapQueryBuilder = new ImapQueryBuilder();
imapQueryBuilder.HasNoFlags(ImapMessageFlags.IsRead); /* get unread messages. */
MailQuery query = imapQueryBuilder.GetQuery();

imapClient.ReadOnly = true;
imapClient.SelectFolder("Inbox");
ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages(query);
Console.WriteLine("Initial Unread Count: " + messageInfoCol.Count());
if (messageInfoCol.Count() > 0)
{
    imapClient.FetchMessage(messageInfoCol[0].SequenceNumber);

    messageInfoCol = imapClient.ListMessages(query);
    // This count will be equal to the initial count
    Console.WriteLine("Updated Unread Count: " + messageInfoCol.Count());
}
else
{
    Console.WriteLine("No unread messages found");
}

Configurazione Autenticazione CRAM-MD5

Per l’autenticazione sicura e l’accesso al server email, Aspose.Email per .NET offre un metodo di autenticazione CRAM-MD5. Il seguente frammento di codice ti mostrerà come funziona con ImapClient:

imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;

Impostare Timeout per Operazioni IMAP

Ogni operazione di posta richiede del tempo a seconda di molti fattori (ritardi di rete, dimensione dei dati, performance del server, ecc.). Puoi impostare un timeout per tutte le operazioni di posta. L’esempio di codice qui sotto mostra come farlo usando il Timeout proprietà. Nota: non dovresti impostare valori grandi per evitare lunghe attese nella tua applicazione.

Configura Timeout di Operazione

using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
    imapClient.Timeout = 60000; // 60 seconds

    // some code...
}

Restringi Timeout di Saluto

Il client IMAP può utilizzare la modalità automatica per stabilire una connessione. In questa modalità, il client IMAP attraversa tutti i possibili parametri di connessione fino a quando la connessione è stabilita. Un server IMAP, in caso di connessione corretta, invia una stringa di benvenuto al client. I server possono usare un avvio di connessione SSL/TLS implicito o esplicito (START TLS). Se la modalità di connessione non corrisponde (ad esempio, il server attende una connessione SSL implicita ma il client tenta di stabilire una connessione non sicura o SSL esplicita), il server non invierà la stringa di benvenuto e l’utente dovrà attendere a lungo fino al timeout per la stringa di benvenuto, e il client passerà all’opzione di connessione successiva. Per evitare questo problema, è stata introdotta la proprietà GreetingTimeout. Questa proprietà consente di impostare il timeout per la stringa di benvenuto e ridurre il tempo di stabilimento automatico della connessione.

using (ImapClient client = new ImapClient("localhost", 993, "username", "password"))
{
    client.GreetingTimeout = 4000;
    client.SelectFolder(ImapFolderInfo.InBox);
}

Utilizzo di Protocolli Criptografici con IMAP

Aspose.Email supporta i protocolli crittografici SSL (obsoleto) e TLS per fornire sicurezza nelle comunicazioni. È possibile abilitare la crittografia crittografica per proteggere lo scambio di dati tra la tua applicazione e i server di posta.

NOTA: Dovresti impostare solo quelle versioni del protocollo che sono supportate dal .NET Framework. Se alcune versioni del protocollo crittografico non sono supportate dalla tua versione corrente del .NET Framework, verranno ignorate e saltate. In questo caso, non verranno generate eccezioni. Per favore utilizza SetSupportedEncryptionUnsafe metodo se vuoi impostare i protocolli senza alcun controllo di compatibilità.

L’esempio di codice seguente ti mostra come impostare TLS 1.3 per ImapClient istanza di classe.

using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
    imapClient.SupportedEncryption = EncryptionProtocols.Tls13;

    // some code...
}

Nel caso in cui un protocollo di crittografia specificato non sia supportato nella versione corrente del .NET Framework, la differenza nel comportamento tra SetSupportedEncryptionUnsafe metodo e SupportedEncryption proprietà è la seguente:

Utilizzo del Comando IMAP IDLE

API di Aspoe.Email ImapClient fornisce la capacità di aprire una connessione al server e attendere l’arrivo di un messaggio email. Questo consente di evitare di interrogare ripetutamente il server per le email in arrivo. Il seguente frammento di codice dimostra come usare la libreria Aspose.Email per monitorare una casella di posta IMAP per nuovi messaggi e messaggi eliminati, e poi eseguire azioni specifiche basate su questi eventi:

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect and log in to IMAP 
ImapClient client = new ImapClient("imap.domain.com", "username", "password");

ManualResetEvent manualResetEvent = new ManualResetEvent(false);
ImapMonitoringEventArgs eventArgs = null;
client.StartMonitoring(delegate(object sender, ImapMonitoringEventArgs e)
{
    eventArgs = e;
    manualResetEvent.Set();
});
Thread.Sleep(2000);
SmtpClient smtpClient = new SmtpClient("exchange.aspose.com", "username", "password");
smtpClient.Send(new MailMessage("from@aspose.com", "to@aspose.com", "EMAILNET-34875 - " + Guid.NewGuid(), "EMAILNET-34875 Support for IMAP idle command"));
manualResetEvent.WaitOne(10000);
manualResetEvent.Reset();
Console.WriteLine(eventArgs.NewMessages.Length);
Console.WriteLine(eventArgs.DeletedMessages.Length);
client.StopMonitoring("Inbox");
smtpClient.Send(new MailMessage("from@aspose.com", "to@aspose.com", "EMAILNET-34875 - " + Guid.NewGuid(), "EMAILNET-34875 Support for IMAP idle command"));
manualResetEvent.WaitOne(5000);

Il seguente esempio di codice mostra come impostare il monitoraggio asincrono per nuovi messaggi email:

var client = = new ImapClient("imap.domain.com", "username", "password");

//anySuccess is a flag to prevent infinite Client.ResumeMonitoring calls
var anySuccess = false;
await client.StartMonitoringAsync(OnNewMessagesCallback, OnErrorCallback);

void OnErrorCallback(object eventSender, ImapMonitoringErrorEventArgs errorEventArguments)
{
    //The exception can be handled here
    Logger.Debug.Write(
        $"An error occured while folder monitoring: {errorEventArguments.FolderName}",
        errorEventArguments.Error);
    //IMAP folder monitoring is stopped on any error. Here is an example
    //of resuming after that.
    if (!anySuccess) return;
    anySuccess = false;
    //Make sure you use ResumeMonitoring instead of StartMonitoring here
    //to prevent missing any emails between the error handling and resuming.
    client.ResumeMonitoring(OnNewMessagesCallback, OnErrorCallback,
        errorEventArguments.MonitoringState);
}

void OnNewMessagesCallback(object sender, ImapMonitoringEventArgs successEventArgs)
{
    anySuccess = true;
    //Use successEventArgs.NewMessages to handle new messages
    //Use successEventArgs.DeletedMessages to handle deleted messages
}

Supporto per le estensioni IMAP

L’API Aspose.Email fornisce il supporto per le estensioni IMAP. Attualmente le seguenti estensioni IMAP sono supportate dall’API. Queste estensioni IMAP non sono supportate da tutti i server.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using (ImapClient client = new ImapClient("imap.gmail.com", 993, "username", "password"))
{
    // Set SecurityOptions
    client.SecurityOptions = SecurityOptions.Auto;
    Console.WriteLine(client.IdSupported.ToString());

    ImapIdentificationInfo serverIdentificationInfo1 = client.IntroduceClient();
    ImapIdentificationInfo serverIdentificationInfo2 = client.IntroduceClient(ImapIdentificationInfo.DefaultValue);

    // Display ImapIdentificationInfo properties
    Console.WriteLine(serverIdentificationInfo1.ToString(), serverIdentificationInfo2);
    Console.WriteLine(serverIdentificationInfo1.Name);
    Console.WriteLine(serverIdentificationInfo1.Vendor);
    Console.WriteLine(serverIdentificationInfo1.SupportUrl);
    Console.WriteLine(serverIdentificationInfo1.Version);
}

Comando IMAP4 Extended List

Il seguente frammento di codice mostra come utilizzare il comando extended list di IMAP4.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using (ImapClient client = new ImapClient("imap.gmail.com", 993, "username", "password"))
{
    ImapFolderInfoCollection folderInfoCol = client.ListFolders("*");
    Console.WriteLine("Extended List Supported: " + client.ExtendedListSupported);
    foreach (ImapFolderInfo folderInfo in folderInfoCol)
    {
        switch (folderInfo.Name)
        {
            case "[Gmail]/All Mail":
                Console.WriteLine("Has Children: " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Bin":
                Console.WriteLine("Bin has children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Drafts":
                Console.WriteLine("Drafts has children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Important":
                Console.WriteLine("Important has Children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Sent Mail":
                Console.WriteLine("Sent Mail has Children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Spam":
                Console.WriteLine("Spam has Children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Starred":
                Console.WriteLine("Starred has Children? " + folderInfo.HasChildren);
                break;
        }
    }
}