Connettersi a Exchange Server usando EWS e IMAP

Per connettersi ai server Exchange 2007, 2010 e 2013 usando Exchange Web Service, Aspose.Email fornisce il IEWSClient interfaccia che implementa il EWSClient classe. Il EWSClient.GetEWSClient il metodo istanzia e restituisce un IEWSClient oggetto che è poi usato per eseguire operazioni relative a una casella di posta Exchange e altre cartelle. Questo articolo mostra come istanziare oggetti di IEWSClient.

Connessione a Exchange Server usando EWS

Il seguente snippet di codice mostra come stabilire una connessione utilizzando Exchange Web Service (EWS):

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
private static IEWSClient GetExchangeEWSClient()
{
    const string mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
    const string domain = @"";
    const string username = @"username@ASE305.onmicrosoft.com";
    const string password = @"password";
    NetworkCredential credentials = new NetworkCredential(username, password, domain);
    IEWSClient client = EWSClient.GetEWSClient(mailboxUri, credentials);
    return client;
}

Aggiungi Intestazioni Personalizzate all’Inizializzazione di EWSClient

In scenari in cui sono necessarie intestazioni specifiche durante l’inizializzazione del client, come l’intestazione X-AnchorMailbox in EWS, utilizza i seguenti metodi sovraccaricati per aggiungere intestazioni personalizzate quando crei un’istanza di IEWSClient:

  • IEWSClient GetEWSClient(string mailboxUri, ICredentials credentials, WebProxy proxy, Dictionary headers)

  • async Task GetEwsClientAsync(string mailboxUri, ICredentials credentials, WebProxy proxy, CancellationToken cancellationToken , Dictionary headers)

Il seguente esempio di codice dimostra come configurare e inizializzare l’IEWSClient utilizzando intestazioni HTTP personalizzate:

var headers = new Dictionary<string, string>();
headers.Add("X-AnchorMailbox", smtpExampleAddress);
IEWSClient client = EWSClient.GetEWSClient(HttpsExampleCom, new OAuthNetworkCredential("UserName", "Token"), null, headers);

Connessione a Exchange Server usando IMAP

Microsoft Exchange Server supporta il protocollo IMAP per accedere agli elementi in una casella di posta. Usa Aspose.Email ImapClient classe per connettersi a Exchange Server usando il protocollo IMAP. Per ulteriori informazioni su ImapClient classe. Prima, assicurati che i servizi IMAP siano abilitati per il tuo Exchange Server:

  1. Apri il Pannello di controllo.
  2. Vai su Strumenti di amministrazione, poi Servizi.
  3. Verifica lo stato del servizio Microsoft Exchange IMAP4.
  4. Se non è già in esecuzione, abilitalo/avvialo.

Il seguente frammento di codice mostra come connettersi e elencare i messaggi dalla cartella Posta in arrivo del server Microsoft Exchange usando il protocollo IMAP.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect to Exchange Server using ImapClient class
ImapClient imapClient = new ImapClient("ex07sp1", "Administrator", "Evaluation1");
imapClient.SecurityOptions = SecurityOptions.Auto;

// Select the Inbox folder
imapClient.SelectFolder(ImapFolderInfo.InBox);

// Get the list of messages
ImapMessageInfoCollection msgCollection = imapClient.ListMessages();
foreach (ImapMessageInfo msgInfo in msgCollection)
{
    Console.WriteLine(msgInfo.Subject);
}
// Disconnect from the server
imapClient.Dispose();

Il seguente frammento di codice mostra come usare SSL.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
public static void Run()
{            
    // Connect to Exchange Server using ImapClient class
    ImapClient imapClient = new ImapClient("ex07sp1", 993, "Administrator", "Evaluation1", new RemoteCertificateValidationCallback(RemoteCertificateValidationHandler));
    imapClient.SecurityOptions = SecurityOptions.SSLExplicit;

    // Select the Inbox folder
    imapClient.SelectFolder(ImapFolderInfo.InBox);

    // Get the list of messages
    ImapMessageInfoCollection msgCollection = imapClient.ListMessages();
    foreach (ImapMessageInfo msgInfo in msgCollection)
    {
        Console.WriteLine(msgInfo.Subject);
    }
    // Disconnect from the server
    imapClient.Dispose();   
}

// Certificate verification handler
private static bool RemoteCertificateValidationHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true; // ignore the checks and go ahead
}

Dopo essersi connessi a un server Exchange usando IMAP e avere ottenuto il IMapMessageInfoCollection, puoi ottenere il MessageInfo oggetto. Il seguente snippet di codice mostra come usare il numero di sequenza del MessageInfo oggetto per salvare un messaggio specifico.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Select the Inbox folder
imapClient.SelectFolder(ImapFolderInfo.InBox);
// Get the list of messages
ImapMessageInfoCollection msgCollection = imapClient.ListMessages();
foreach (ImapMessageInfo msgInfo in msgCollection)
{
    // Fetch the message from inbox using its SequenceNumber from msgInfo
    MailMessage message = imapClient.FetchMessage(msgInfo.SequenceNumber);

    // Save the message to disc now
    message.Save(dataDir + msgInfo.SequenceNumber + "_out.msg", SaveOptions.DefaultMsgUnicode);
}

Impostare il Protocollo di Crittografia Preferito

EWS utilizza il protocollo di trasporto HTTPS per le operazioni supportate. La crittografia è fornita dai protocolli SSL/TLS. Questi protocolli sono implementati dal framework .NET e possono variare a seconda della versione corrente del framework .NET.

Per impostare la versione SSL/TLS usa il seguente codice:

var client = new ImapClient("some.host");
client.SupportedEncryption = EncryptionProtocols.Tls13;

oppure

var client = new ImapClient("some.host");
client.SetSupportedEncryptionUnsafe(EncryptionProtocols.Tls13);

Nota, se il EncryptionProtocol specificato non è supportato dalla versione corrente del framework .NET, il SupportedEncryption la proprietà degrada il protocollo di crittografia a un livello supportato e il SetSupportedEncryptionUnsafe il metodo genera un’eccezione.

Connettersi a Exchange Server usando l’Autenticazione Moderna

L’Autenticazione Moderna è ora abilitata per impostazione predefinita per tutti i nuovi tenant Microsoft 365/Azure perché questo protocollo è più sicuro rispetto all’autenticazione Basic, ormai deprecata.

L’Autenticazione Moderna si basa su Active Directory Authentication Library e OAuth 2.0. Utilizza token a tempo limitato e le applicazioni non memorizzano le credenziali dell’utente.

Impostazioni prerequisito

Per utilizzare l’Autenticazione Moderna, assicurati che sia abilitata. Tuttavia, per i tenant creati prima del 1 agosto 2017, l’autenticazione moderna è disabilitata per impostazione predefinita. Nella Centro amministrativo Microsoft 365, vai su Impostazioni > Impostazioni Org > Autenticazione Moderna. Nella finestra a comparsa Autenticazione Moderna che appare, puoi identificare i protocolli che non richiedono più l’autenticazione Basic. Per i nuovi tenant Microsoft365 in Azure, l’autenticazione Basic è disabilitata per impostazione predefinita per tutte le applicazioni. Pertanto, il testo verrà visualizzato in questa sezione.

La tua organizzazione ha le impostazioni di sicurezza predefinite abilitate, il che significa che è richiesta l’autenticazione moderna per Exchange Online, e le connessioni con autenticazione di base sono bloccate. > È necessario disattivare le impostazioni di sicurezza predefinite nel portale Azure prima di poter modificare queste impostazioni.

Puoi abilitare il supporto Basic Auth per il tenant dal Azure portale, vai su Azure Active Directory > Proprietà > Gestisci impostazioni di sicurezza predefinite > Abilita impostazioni di sicurezza predefinite > No. Per maggiori informazioni, consulta il Articolo della Documentazione Microsoft.

Registrazione dell’App con Azure Active Directory

È necessario eseguire la registrazione dell’app con Azure Active Directory. Esistono due tipi di permessi che possono essere usati per accedere alle cassette postali con la tua app. Scegli un tipo specifico di permesso, in base all’app che stai creando:

  • Le app che utilizzano permessi delegati hanno un utente autenticato presente. In altre parole, quando ti connetti al servizio, appare una finestra di dialogo per nome utente e password. L’app non può mai avere più privilegi di un utente autenticato.
  • Le app che utilizzano permessi di applicazione funzionano senza un utente autenticato presente. Ad esempio, queste sono app che operano come servizi o demoni in background. Solo un amministratore può concedere i permessi di applicazione.

Inoltre, fai riferimento al Articolo della Documentazione Microsoft per ulteriori informazioni.

La procedura di registrazione dipende dal tipo di autorizzazione selezionato. Per registrare la tua app, fai riferimento al Articolo della Documentazione Microsoft.

Utilizzare l’Autenticazione Moderna con EWSClient

Dopo aver registrato l’applicazione, possiamo concentrarci sulla scrittura del codice, che comprenderà le seguenti parti:

  • Ottieni il token di autorizzazione.
  • Usa il token per autenticare.

Ottieni Token di Autorizzazione

Per ottenere il token useremo Microsoft Authentication Library (MSAL) per .NET.

Di seguito i passaggi per ottenere il token di autorizzazione.

  • Aggiungi il/la pacchetto NuGet Microsoft.Identity.Client che contiene i binari di MSAL.NET.
  • Crea una classe AccessParameters per memorizzare le credenziali.
  • Crea un metodo che accetta parametri di accesso e utilizza MSAL.NET per ottenere un token di accesso.

I seguenti esempi di codice dipenderanno dal tipo di autenticazione scelto.

Ottieni un token con autenticazione delegata

public class AccessParameters
{
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string RedirectUri { get; set; } = "http://localhost";
    public string[] Scopes { get; set; } = { "https://outlook.office365.com/EWS.AccessAsUser.All" };
}

public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
    var pca = PublicClientApplicationBuilder
                            .Create(accessParameters.ClientId)
                            .WithTenantId(accessParameters.TenantId)
                            .WithRedirectUri(ccessParameters.RedirectUri)
                            .Build();

    var result = await pca.AcquireTokenInteractive(accessParameters.Scopes)
        .WithUseEmbeddedWebView(false)
        .ExecuteAsync();

    return result.AccessToken;
}

Ottieni un token con autenticazione app

public class AccessParameters
{
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string ClientSecret { get; set; }
    public string[] Scopes { get; set; } = { "https://outlook.office365.com/.default" };
}

public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
    var cca = ConfidentialClientApplicationBuilder
        .Create(accessParameters.ClientId)
        .WithClientSecret(accessParameters.ClientSecret)
        .WithTenantId(accessParameters.TenantId)
        .Build();

    var result = await cca.AcquireTokenForClient(accessParameters.Scopes).ExecuteAsync();

    return result.AccessToken;
}

Autenticazione con il Token

Successivamente, quando avremo ottenuto correttamente un token, inizializziamo il EwsClient.

Utilizzare il token con autenticazione delegata

NetworkCredential credentials = new OAuthNetworkCredential(accessToken);

using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);

Utilizzare il token con autenticazione app

// Use Microsoft365 username and access token
NetworkCredential credentials = new OAuthNetworkCredential(username, accessToken);

using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);

Utilizzare l’Autenticazione Moderna con client IMAP, POP o SMTP

L’accesso IMAP, POP, SMTP tramite permessi di applicazione non è supportato. In altre parole, è supportata solo l’autenticazione delegata.

La procedura di registrazione dell’App con Azure Active Directory è definita sopra.

Abilita o Disabilita IMAP, POP, SMTP AUTH nel Centro Amministrativo Microsoft 365

  • Apri il Centro amministrativo Microsoft 365 e vai su Utenti > Utenti attivi.
  • Seleziona l’utente e nella finestra a comparsa che appare, fai clic su Posta.
  • Nella sezione App email, fai clic su Gestisci app email.
  • Verifica l’impostazione IMAP, POP, SMTP Autenticato: deselezionata = disabilitata, selezionata = abilitata.
  • Fai clic su Salva le modifiche.

Recupera il Token di Autenticazione dal Server Token

Assicurati di specificare gli scope completi, includendo gli URL delle risorse Outlook.

IMAP: https://outlook.office.com/IMAP.AccessAsUser.All POP: https://outlook.office.com/POP.AccessAsUser.All SMTP: https://outlook.office.com/SMTP.Send

Per ottenere il token useremo Microsoft Authentication Library (MSAL) per .NET.

Di seguito i passaggi per ottenere il token di autorizzazione.

  • Aggiungi il/la pacchetto NuGet Microsoft.Identity.Client che contiene i binari di MSAL.NET.
  • Crea una classe AccessParameters per memorizzare le credenziali.
  • Crea un metodo che accetta parametri di accesso e utilizza MSAL.NET per ottenere un token di accesso.
public class AccessParameters
{
    public string TenantId { get; set; }
    public string ClientId { get; set; }
    public string RedirectUri { get; set; } = "http://localhost";
    public string[] Scopes { get; set; } = { 
        "https://outlook.office.com/IMAP.AccessAsUser.All", 
        "https://outlook.office.com/SMTP.Send" };
}

public static async Task<string> GetAccessToken(AccessParameters accessParameters)
{
    var pca = PublicClientApplicationBuilder
                            .Create(accessParameters.ClientId)
                            .WithTenantId(accessParameters.TenantId)
                            .WithRedirectUri(ccessParameters.RedirectUri)
                            .Build();

    var result = await pca.AcquireTokenInteractive(accessParameters.Scopes)
        .WithUseEmbeddedWebView(false)
        .ExecuteAsync();

    return result.AccessToken;
}

Autenticati con il Token

Successivamente, quando avremo ottenuto correttamente un token, inizializziamo il ImapClient.

var imapClient = new ImapClient(
    "outlook.office365.com", 
    993, 
    username, 
    accessToken, 
    true);

Allo stesso modo, il SmtpClient l’inizializzazione avrà il seguente aspetto.

var smtpClient = new SmtpClient(
    "smtp.office365.com",
    587, 
    username,
    accessToken, 
    true);

Restituisci l’ID della Richiesta Client

Il ReturnClientRequestId proprietà è stata aggiunta a EWSClient per tua comodità per specificare se l’ID della richiesta client deve essere restituito nella risposta dalle chiamate Exchange Web Services (EWS). L’ID della richiesta client è un identificatore unico che puoi impostare per ogni richiesta EWS inviata dalla tua applicazione. Impostando il ReturnClientRequestId impostando la proprietà su true, indichi che desideri che l’ID della richiesta client sia incluso nella risposta del server EWS. Questo può essere utile per tracciare e correlare richieste e risposte in scenari in cui più richieste sono effettuate e elaborate in modo asincrono.

Il seguente snippet di codice mostra come la proprietà può essere utilizzata:

using (IEWSClient client = TestUtil.CreateEWSClient(user))
{
   // Client will create random id and pass it to the server.
   // The server should include this id in request-id header of all responses.
   client.ReturnClientRequestId = true;
   
   client.LogFileName = "ews.log";
   client.GetMailboxInfo();
}

Aggiungi X-AnchorMailbox e altre intestazioni alle richieste EWS

L’API Aspose.Email consente di aggiungere intestazioni alle richieste Exchange. Questo può essere usato per aggiungere intestazioni alle richieste EWS per diversi scopi. Un esempio potrebbe essere l’aggiunta dell’intestazione X-AnchorMailbox, usata per gestire i problemi di throttling sul server Exchange. Il AddHeader metodo del IEWSClient viene utilizzato per aggiungere intestazioni alle richieste EWS come mostrato nel seguente snippet di codice.

Ignora o Bypassa Certificato SSL Non Valido o Scaduto

Aspose.Email può gestire i certificati SSL su Exchange Server usando entrambi i ExchangeClient e EWSClient classi. Se il certificato SSL è scaduto o è diventato non valido, Aspose.Email genera un’eccezione a causa del certificato SSL non valido. Evita tali errori di certificato SSL ignorandoli usando il metodo mostrato nel codice seguente. Registra il gestore di callback nel tuo metodo main() o init() e aggiungi il metodo seguente come membro della classe.