Verbind met Exchange Server met behulp van EWS en IMAP

Om verbinding te maken met Exchange-servers 2007, 2010 en 2013 via Exchange Web Service, biedt Aspose.Email de IEWSClient interface die de EWSClient klasse. De EWSClient.GetEWSClient methode instantieert en retourneert een IEWSClient object dat verder wordt gebruikt om bewerkingen uit te voeren gerelateerd aan een Exchange-mailbox en andere mappen. Dit artikel toont hoe objecten van IEWSClient.

Verbinden met Exchange Server via EWS

Het volgende codefragment laat zien hoe u een verbinding tot stand brengt met 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;
}

Aangepaste Headers toevoegen aan EWSClient‑initialisatie

In scenario’s waarin specifieke headers vereist zijn tijdens de clientinitialisatie, zoals de X-AnchorMailbox-header in EWS, gebruikt u de volgende overload‑methoden om aangepaste headers toe te voegen bij het aanmaken van een instantie van IEWSClient:

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

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

Het onderstaande codevoorbeeld toont hoe u de IEWSClient configureert en initialiseert met behulp van aangepaste HTTP‑headers:

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

Verbinden met Exchange Server via IMAP

Microsoft Exchange Server ondersteunt het IMAP‑protocol voor het benaderen van items in een mailbox. Gebruik Aspose.Email ImapClient klasse om verbinding te maken met de Exchange Server via het IMAP-protocol. Voor meer informatie over de ImapClient klasse. Zorg er eerst voor dat IMAP-services zijn ingeschakeld voor je Exchange Server:

  1. Open het Configuratiescherm.
  2. Ga naar Beheertools, vervolgens Services.
  3. Controleer de status van de Microsoft Exchange IMAP4-service.
  4. Als het nog niet draait, schakel het in/start het.

Het volgende codefragment toont hoe je verbinding maakt en berichtenlijst ophaalt uit de Inbox-map van een Microsoft Exchange-server met het IMAP-protocol.

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

Het volgende codefragment toont hoe je SSL gebruikt.

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

Na verbinding te hebben gemaakt met een Exchange-server via IMAP en het ophalen van de IMapMessageInfoCollection, kunt u de MessageInfo object. De volgende codefragment laat zien hoe u het volgnummer van de MessageInfo object om een specifiek bericht op te slaan.

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

Instellen van het Voorkeur Encryptieprotocol

EWS maakt gebruik van het HTTPS‑transportprotocol voor ondersteunde bewerkingen. Encryptie wordt geleverd door SSL/TLS‑protocollen. Deze protocollen worden geïmplementeerd door het .NET‑framework en kunnen verschillen afhankelijk van de huidige versie van het .NET‑framework.

Gebruik de volgende code om de SSL/TLS‑versie in te stellen:

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

of

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

Opmerking, als het opgegeven EncryptionProtocol niet wordt ondersteund door de huidige versie van het .NET‑framework, zal de SupportedEncryption eigenschap degradeert het encryptieprotocol tot een ondersteund niveau en de SetSupportedEncryptionUnsafe methode werpt een uitzondering.

Verbind met Exchange Server met Moderne Authenticatie

Moderne Authenticatie is nu standaard ingeschakeld voor alle nieuwe Microsoft 365/Azure‑tenants, omdat dit protocol veiliger is dan de verouderde Basic Authentication.

Moderne Authenticatie is gebaseerd op Active Directory Authentication Library en OAuth 2.0. Het gebruikt tijdsgebonden tokens en applicaties slaan geen gebruikersreferenties op.

Voorafgaande instellingen

Om Moderne Authenticatie te gebruiken, zorg dat deze is ingeschakeld. Voor tenants die vóór 1 augustus 2017 zijn aangemaakt, is moderne authenticatie standaard uitgeschakeld. In de Microsoft 365‑beheerderscentrum, ga naar Settings > Org Settings > Modern Authentication. In de Modern authentication flyout die verschijnt, kunt u de protocollen identificeren die geen Basic‑authenticatie meer vereisen. Voor nieuwe Microsoft 365‑tenants in Azure is Basic Authentication standaard uitgeschakeld voor alle applicaties. Daarom wordt de tekst in deze sectie weergegeven.

Uw organisatie heeft beveiligingsstandaarden ingeschakeld, wat betekent dat moderne authenticatie voor Exchange Online vereist is en basisauthenticatieverbindingen geblokkeerd zijn. > U moet beveiligingsstandaarden uitschakelen in het Azure‑portal voordat u hier instellingen kunt wijzigen.

U kunt Basic Auth-ondersteuning voor de tenant inschakelen vanuit de Azure portal, ga naar Azure Active Directory > Properties > Manage Security defaults > Enable Security defaults > No. Voor meer informatie, zie de Microsoft Documentatie‑artikel.

App-registratie met Azure Active Directory

Het is noodzakelijk om een app-registratie uit te voeren bij Azure Active Directory. Er zijn twee soorten toestemmingen die kunnen worden gebruikt om mailboxen met uw app te benaderen. Kies een specifiek type toestemming, afhankelijk van de app die u maakt:

  • Apps die Gedelegeerde toestemmingen gebruiken, hebben een ingelogde gebruiker. Met andere woorden, wanneer u verbinding maakt met de service, verschijnt er een dialoogvenster voor een gebruikersnaam en wachtwoord. Een app kan nooit meer rechten hebben dan een ingelogde gebruiker.
  • Apps die Applicatietoestemmingen gebruiken, draaien zonder een ingelogde gebruiker. Bijvoorbeeld, dit zijn apps die draaien als achtergrondservices of daemon-processen. Alleen een beheerder kan instemmen met applicatietoestemmingen.

Zie bovendien de Microsoft Documentatie‑artikel voor meer informatie.

De registratieprocedure hangt af van het geselecteerde type toestemming. Zie voor het registreren van uw app de Microsoft Documentatie‑artikel.

Gebruik Moderne Authenticatie met EWSClient

Na het registreren van de applicatie kunnen we ons richten op het schrijven van de code, die uit de volgende delen zal bestaan:

  • Haal het autorisatietoken op.
  • Gebruik het token om te authenticeren.

Verkrijg Autorisatietoken

Om het token te krijgen gebruiken we Microsoft Authentication Library (MSAL) for .NET.

Dit zijn de stappen om een autorisatietoken te krijgen.

  • Voeg de toe Microsoft.Identity.Client NuGet-pakket die de binaries van de MSAL.NET bevat.
  • Maak een AccessParameters-klasse om inloggegevens op te slaan.
  • Maak een methode die toegangsparameters accepteert en MSAL.NET gebruikt om een toegangstoken te verkrijgen.

De volgende codevoorbeelden zijn afhankelijk van het gekozen type authenticatie.

Haal een token op met gedelegeerde authenticatie

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

Haal een token op met app-authenticatie

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

Authenticeren met het Token

Daarna, wanneer we succesvol een token hebben verkregen, initialiseert u de EwsClient.

Het token gebruiken met gedelegeerde authenticatie

NetworkCredential credentials = new OAuthNetworkCredential(accessToken);

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

Het token gebruiken met app‑authenticatie

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

Gebruik Moderne Authenticatie met IMAP-, POP- of SMTP‑clients

Toegang tot IMAP, POP, SMTP via applicatietoestemmingen wordt niet ondersteund. Met andere woorden, alleen gedelegeerde authenticatie wordt ondersteund.

De procedure voor App‑registratie met Azure Active Directory is gedefinieerd hierboven.

IMAP, POP, SMTP AUTH in Microsoft 365‑beheerderscentrum in-/uitschakelen

  • Open de Microsoft 365‑beheerderscentrum en ga naar Users > Active users.
  • Selecteer de gebruiker en klik in het venster dat verschijnt op Mail.
  • In de sectie Email apps, klik op Manage email apps.
  • Controleer de instelling IMAP, POP, Authenticated SMTP: uitgevinkt = uitgeschakeld, aangevinkt = ingeschakeld.
  • Klik op Save changes.

Ophalen van Authenticatietoken van Token‑Server

Zorg ervoor dat u de volledige scopes opgeeft, inclusief de Outlook‑resource‑URL’s.

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

Om het token te krijgen gebruiken we Microsoft Authentication Library (MSAL) for .NET.

Dit zijn de stappen om een autorisatietoken te krijgen.

  • Voeg de toe Microsoft.Identity.Client NuGet-pakket die de binaries van de MSAL.NET bevat.
  • Maak een AccessParameters-klasse om inloggegevens op te slaan.
  • Maak een methode die toegangsparameters accepteert en MSAL.NET gebruikt om een toegangstoken te verkrijgen.
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;
}

Authenticeren met het Token

Daarna, wanneer we succesvol een token hebben verkregen, initialiseert u de ImapClient.

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

Evenzo, de SmtpClient initialisatie zal er als volgt uitzien.

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

Retourneer de Client Request ID

De ReturnClientRequestId eigenschap is toegevoegd aan EWSClient voor uw gemak om op te geven of de client request ID moet worden geretourneerd in het antwoord van Exchange Web Services (EWS) oproepen. De client request ID is een unieke identifier die u kunt instellen voor elk EWS verzoek dat vanuit uw applicatie wordt verzonden. Door het instellen van de ReturnClientRequestId Wanneer u de eigenschap op true zet, geeft u aan dat u wilt dat de client‑request‑ID wordt opgenomen in de respons van de EWS‑server. Dit kan nuttig zijn voor het volgen en correleren van verzoeken en antwoorden in scenario’s waarin meerdere verzoeken asynchroon worden gemaakt en verwerkt.

Het volgende codefragment laat zien hoe de eigenschap kan worden gebruikt:

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

X-AnchorMailbox en andere headers toevoegen aan EWS‑verzoeken

De Aspose.Email‑API maakt het mogelijk headers toe te voegen aan Exchange‑verzoeken. Dit kan worden gebruikt om verschillende headers aan de EWS‑verzoeken toe te voegen voor diverse doeleinden. Een voorbeeld is het toevoegen van de X-AnchorMailbox‑header die wordt gebruikt om throttling‑problemen op de Exchange‑server te beheren. De AddHeader methode van de IEWSClient wordt gebruikt om headers toe te voegen aan de EWS‑verzoeken zoals getoond in het onderstaande codefragment.

Negeer of omzeil ongeldig of verlopen SSL‑certificaat

Aspose.Email kan SSL‑certificaten op Exchange Server verwerken met zowel de ExchangeClient en EWSClient klassen. Als het SSL‑certificaat is verlopen of ongeldig is geworden, gooit Aspose.Email een uitzondering vanwege een ongeldig SSL‑certificaat. Vermijd dergelijke SSL‑certificaatfouten door ze te negeren met behulp van de methode die in de onderstaande code wordt gebruikt. Registreer de callback‑handler in uw main() of init() methode en voeg de onderstaande methode toe als lid van de klasse.