Anslut till Exchange Server med EWS och IMAP

För att ansluta till Exchange‑servrar 2007, 2010 och 2013 med Exchange Web Service, tillhandahåller Aspose.Email IEWSClient gränssnitt som implementerar EWSClient klass. Den EWSClient.GetEWSClient metod instansierar och returnerar en IEWSClient objekt som sedan används för att utföra operationer relaterade till en Exchange‑brevlåda och andra mappar. Denna artikel visar hur man instansierar objekt av IEWSClient.

Ansluta till Exchange‑server med EWS

Följande kodsnutt visar hur du etablerar en anslutning med 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;
}

Lägg till anpassade rubriker vid EWSClient‑initialisering

I scenarier där specifika rubriker krävs under klientinitialisering, såsom X-AnchorMailbox‑rubriken i EWS, använd följande överlagrade metoder för att lägga till anpassade rubriker när du skapar en instans av IEWSClient:

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

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

Kodexemplet nedan visar hur du konfigurerar och initierar IEWSClient samtidigt som du använder anpassade HTTP‑rubriker:

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

Ansluta till Exchange‑server med IMAP

Microsoft Exchange Server stödjer IMAP‑protokollet för åtkomst till objekt i en brevlåda. Använd Aspose.Email ImapClient klass för att ansluta till Exchange‑servern med IMAP‑protokollet. För mer information om ImapClient klass. Se först till att IMAP‑tjänster är aktiverade för din Exchange‑server:

  1. Öppna Kontrollpanelen.
  2. Gå till Administrationsverktyg, sedan Tjänster.
  3. Kontrollera statusen för Microsoft Exchange IMAP4‑tjänsten.
  4. Om den inte redan körs, aktivera/starta den.

Följande kodsnutt visar hur du ansluter och listar meddelanden från Inkorg‑mappen på Microsoft Exchange‑server med IMAP‑protokollet.

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

Följande kodsnutt visar hur du använder 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
}

Efter att ha anslutit till en Exchange‑server med IMAP och hämtat IMapMessageInfoCollection, kan du hämta MessageInfo objekt. Följande kodsnutt visar hur du använder sekvensnumret för MessageInfo objekt för att spara ett specifikt meddelande.

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

Inställning av föredraget krypteringsprotokoll

EWS använder HTTPS‑transportprotokoll för stödda operationer. Kryptering tillhandahålls av SSL/TLS‑protokoll. Dessa protokoll implementeras av .NET‑frameworket och kan variera beroende på den aktuella versionen av .NET‑frameworket.

För att ställa in SSL/TLS‑versionen, använd följande kod:

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

eller

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

Observera, om det angivna EncryptionProtocol inte stöds av den aktuella versionen av .NET‑frameworket, så SupportedEncryption egenskapen nedgraderar krypteringsprotokollet till en stödd nivå och SetSupportedEncryptionUnsafe metod kastar ett undantag.

Anslut till Exchange Server med modern autentisering

Modern autentisering är nu aktiverad som standard för alla nya Microsoft 365/Azure‑hyresgäster eftersom detta protokoll är säkrare än den föråldrade grundläggande autentiseringen.

Modern autentisering baseras på Active Directory Authentication Library och OAuth 2.0. Den använder tidsbegränsade token och applikationer lagrar inte användaruppgifter.

Förinställningar

För att använda modern autentisering, se till att den är aktiverad. För hyresgäster som skapades innan 1 augusti 2017 är modern autentisering avaktiverad som standard. I Microsoft 365‑administrationscenter, gå till Settings > Org Settings > Modern Authentication. I den Modern authentication‑flyout som visas kan du identifiera de protokoll som inte längre kräver grundläggande autentisering. För nya Microsoft 365‑hyresgäster i Azure är grundläggande autentisering inaktiverad som standard för alla applikationer. Därför kommer texten att visas i detta avsnitt.

Din organisation har säkerhetsstandarder aktiverade, vilket innebär att modern autentisering till Exchange Online krävs och anslutningar med grundläggande autentisering blockeras. > Du måste stänga av säkerhetsstandarderna i Azure‑portalen innan du kan ändra några inställningar här.

Du kan aktivera stöd för grundläggande autentisering för hyresgästen från Azure portalen, gå till Azure Active Directory > Properties > Manage Security defaults > Enable Security defaults > No. För mer information, se Microsoft dokumentationsartikel.

Appregistrering med Azure Active Directory

Det är nödvändigt att utföra appregistrering med Azure Active Directory. Det finns två typer av behörigheter som kan användas för att komma åt brevlådor med din app. Välj en specifik typ av behörighet, beroende på vilken app du skapar:

  • Appar som använder delegerade behörigheter har en inloggad användare närvarande. Med andra ord, när du ansluter till tjänsten visas ett dialogfönster för användarnamn och lösenord. En app kan aldrig ha fler privilegier än den inloggade användaren.
  • Appar som använder applikationsbehörigheter körs utan att en inloggad användare finns närvarande. Till exempel är detta appar som körs som bakgrundstjänster eller daemons. Endast en administratör kan samtycka till applikationsbehörigheter.

Se dessutom Microsoft dokumentationsartikel för mer information.

Registreringsproceduren beror på vilken typ av behörighet som valts. För att registrera din app, se Microsoft dokumentationsartikel.

Använd modern autentisering med EWSClient

Efter att applikationen har registrerats kan vi fokusera på att skriva koden, som kommer bestå av följande delar:

  • Hämta auktoriseringstoken.
  • Använd token för att autentisera.

Hämta auktoriseringstoken

För att hämta token kommer vi att använda Microsoft Authentication Library (MSAL) för .NET.

Följande är stegen för att hämta en auktoriseringstoken.

  • Lägg till Microsoft.Identity.Client NuGet‑paket som innehåller binärerna för MSAL.NET.
  • Skapa en AccessParameters‑klass för att lagra autentiseringsuppgifter.
  • Skapa en metod som accepterar åtkomstparametrar och använder MSAL.NET för att hämta en åtkomsttoken.

Följande kodexempel beror på vilken autentiseringstyp som valts.

Hämta en token med delegerad autentisering

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

Hämta en token med app‑autentisering

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

Autentisering med token

Efter det, när vi har erhållit en token framgångsrikt, låt oss initiera EwsClient.

Användning av token med delegerad autentisering

NetworkCredential credentials = new OAuthNetworkCredential(accessToken);

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

Användning av token med app‑autentisering

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

Använd modern autentisering med IMAP-, POP- eller SMTP‑klienter

IMAP-, POP- och SMTP‑åtkomst via applikationsbehörigheter stöds inte. Med andra ord stöds endast delegerad autentisering.

Proceduren för appregistrering med Azure Active Directory är definierad ovan.

Aktivera eller inaktivera IMAP, POP, SMTP‑AUTH i Microsoft 365‑admincenter

  • Öppna Microsoft 365‑administrationscenter och gå till Users > Active users.
  • Välj användaren och i den flyout som visas klickar du på Mail.
  • I avsnittet Email apps, klicka på Manage email apps.
  • Verifiera inställningen IMAP, POP, Authenticated SMTP: avmarkerad = inaktiverad, markerad = aktiverad.
  • Klicka på Spara ändringar.

Hämta autentiseringstoken från token‑servern

Se till att ange de fullständiga omfattningarna, inklusive Outlook‑resurs‑URL:er.

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

För att hämta token kommer vi att använda Microsoft Authentication Library (MSAL) för .NET.

Följande är stegen för att hämta en auktoriseringstoken.

  • Lägg till Microsoft.Identity.Client NuGet‑paket som innehåller binärerna för MSAL.NET.
  • Skapa en AccessParameters‑klass för att lagra autentiseringsuppgifter.
  • Skapa en metod som accepterar åtkomstparametrar och använder MSAL.NET för att hämta en åtkomsttoken.
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;
}

Autentisera med token

Efter det, när vi har erhållit en token framgångsrikt, låt oss initiera ImapClient.

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

På samma sätt, SmtpClient initialisering kommer att se ut som följer.

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

Returnera klientens begäran‑ID

Den ReturnClientRequestId egenskapen lades till i EWSClient för din bekvämlighet för att specificera om klientens begäran‑ID ska returneras i svaret från Exchange Web Services (EWS)‑anrop. Klientens begäran‑ID är en unik identifierare som du kan ange för varje EWS‑förfrågan som skickas från din applikation. Genom att ange ReturnClientRequestId sätter egenskapen till true, vilket indikerar att du vill att klientens förfrågnings‑ID inkluderas i svaret från EWS‑servern. Detta kan vara användbart för att spåra och korrelera förfrågningar och svar i scenarier där flera förfrågningar görs och bearbetas asynkront.

Följande kodsnutt visar hur egenskapen kan användas:

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

Lägg till X-AnchorMailbox och andra rubriker till EWS‑förfrågningar

Aspose.Email‑API tillåter att lägga till rubriker i Exchange‑förfrågningar. Detta kan användas för att lägga till rubriker till EWS‑förfrågningarna för olika ändamål. Ett exempel är att lägga till X-AnchorMailbox‑rubriken som används för att hantera throttling‑problem på Exchange‑servern. The AddHeader metod för IEWSClient används för att lägga till rubriker till EWS‑förfrågningarna som visas i följande kodsnutt.

Ignorera eller kringgå ogiltigt eller utgånget SSL‑certifikat

Aspose.Email kan hantera SSL‑certifikat på Exchange Server med både ExchangeClient och EWSClient klasser. Om SSL‑certifikatet har gått ut eller blivit ogiltigt kastar Aspose.Email ett undantag på grund av ogiltigt SSL‑certifikat. Undvik sådana SSL‑certifikatfel genom att ignorera dem med metoden som används i koden nedan. Registrera callback‑hanteraren i din main() eller init()‑metod och lägg till metoden nedan som en medlem i klassen.