Połącz się z serwerem Exchange używając EWS i IMAP

Aby połączyć się z serwerami Exchange 2007, 2010 i 2013 przy użyciu Exchange Web Service, Aspose.Email zapewnia IEWSClient interfejs, który implementuje EWSClient klasa. Ta EWSClient.GetEWSClient metoda tworzy i zwraca IEWSClient obiekt, który jest dalej używany do wykonywania operacji związanych ze skrzynką pocztową Exchange i innymi folderami. Ten artykuł pokazuje, jak tworzyć obiekty IEWSClient.

Łączenie się z serwerem Exchange przy użyciu EWS

Poniższy fragment kodu pokazuje, jak nawiązać połączenie przy użyciu 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;
}

Dodaj niestandardowe nagłówki do inicjalizacji EWSClient

W scenariuszach, w których wymagane są określone nagłówki podczas inicjalizacji klienta, takich jak nagłówek X-AnchorMailbox w EWS, użyj poniższych przeciążonych metod, aby dodać niestandardowe nagłówki przy tworzeniu instancji IEWSClient:

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

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

Poniższy przykład kodu demonstruje, jak skonfigurować i zainicjalizować IEWSClient, wykorzystując niestandardowe nagłówki HTTP:

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

Łączenie się z serwerem Exchange przy użyciu IMAP

Microsoft Exchange Server obsługuje protokół IMAP do dostępu do elementów w skrzynce pocztowej. Użyj Aspose.Email ImapClient klasa do łączenia się z serwerem Exchange przy użyciu protokołu IMAP. Aby uzyskać więcej informacji o ImapClient klasa. Najpierw upewnij się, że usługi IMAP są włączone w twoim serwerze Exchange:

  1. Otwórz Panel sterowania.
  2. Przejdź do Narzędzia administratora, a następnie Usługi.
  3. Sprawdź status usługi Microsoft Exchange IMAP4.
  4. Jeśli nie jest już uruchomiony, włącz/uruchom go.

Poniższy fragment kodu pokazuje, jak połączyć się i wylistować wiadomości z folderu Odebrane serwera Microsoft Exchange przy użyciu protokołu 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();

Poniższy fragment kodu pokazuje, jak używać 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
}

Po połączeniu się z serwerem Exchange przy użyciu IMAP i uzyskaniu IMapMessageInfoCollection, możesz uzyskać MessageInfo obiekt. Poniższy fragment kodu pokazuje, jak używać numeru sekwencji MessageInfo obiekt do zapisywania konkretnej wiadomości.

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

Ustawianie preferowanego protokołu szyfrowania

EWS używa protokołu transportowego HTTPS dla obsługiwanych operacji. Szyfrowanie jest zapewniane przez protokoły SSL/TLS. Protokoły te są implementowane w platformie .NET i mogą się różnić w zależności od bieżącej wersji .NET.

Aby ustawić wersję SSL/TLS, użyj poniższego kodu:

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

lub

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

Uwaga, jeśli określony EncryptionProtocol nie jest obsługiwany przez bieżącą wersję platformy .NET, to SupportedEncryption właściwość obniża protokół szyfrowania do obsługiwanego poziomu i SetSupportedEncryptionUnsafe metoda rzuca wyjątek.

Połącz się z serwerem Exchange używając Modern Authentication

Modern Authentication jest teraz domyślnie włączone dla wszystkich nowych tenantów Microsoft 365/Azure, ponieważ ten protokół jest bezpieczniejszy niż przestarzałe Basic Authentication.

Modern Authentication opiera się na Active Directory Authentication Library i OAuth 2.0. Używa tokenów o ograniczonym czasie ważności, a aplikacje nie przechowują poświadczeń użytkownika.

Ustawienia wstępne

Aby używać Modern Authentication, upewnij się, że jest włączone. Jednak dla tenantów utworzonych przed 1 sierpnia 2017 r., nowoczesne uwierzytelnianie jest domyślnie wyłączone. W centrum administracyjne Microsoft 365, przejdź do Settings > Org Settings > Modern Authentication. W wyświetlonym Modern authentication flyout możesz zidentyfikować protokoły, które nie wymagają już Basic authentication. Dla nowych tenantów Microsoft365 w Azure, Basic Authentication jest domyślnie wyłączone dla wszystkich aplikacji. Dlatego tekst będzie wyświetlany w tej sekcji.

Twoja organizacja ma włączone domyślne zabezpieczenia, co oznacza, że wymagana jest nowoczesna autoryzacja do Exchange Online, a połączenia podstawowe (basic authentication) są zablokowane. > Musisz wyłączyć domyślne zabezpieczenia w portalu Azure, zanim będziesz mógł zmienić tutaj ustawienia.

Możesz włączyć obsługę Basic Auth dla tenantu z Azure portal, przejdź do Azure Active Directory > Properties > Manage Security defaults > Enable Security defaults > No. Aby uzyskać więcej informacji, zobacz Artykuł dokumentacji Microsoftu.

Rejestracja aplikacji w Azure Active Directory

Należy przeprowadzić rejestrację aplikacji w Azure Active Directory. Istnieją dwa typy uprawnień, które mogą być użyte do dostępu do skrzynek pocztowych za pomocą aplikacji. Wybierz konkretny typ uprawnień, w zależności od tworzonej aplikacji:

  • Aplikacje używające uprawnień delegowanych mają zalogowanego użytkownika. Innymi słowy, gdy łączysz się z usługą, pojawia się okno dialogowe z nazwą użytkownika i hasłem. Aplikacja nigdy nie może mieć więcej uprawnień niż zalogowany użytkownik.
  • Aplikacje używające uprawnień aplikacji działają bez zalogowanego użytkownika. Na przykład są to aplikacje działające jako usługi w tle lub demony. Tylko administrator może wyrazić zgodę na uprawnienia aplikacji.

Dodatkowo, odnieś się do Artykuł dokumentacji Microsoftu po więcej informacji.

Procedura rejestracji zależy od wybranego typu uprawnień. Aby zarejestrować aplikację, zapoznaj się z Artykuł dokumentacji Microsoftu.

Użyj nowoczesnego uwierzytelniania z EWSClient

Po zarejestrowaniu aplikacji możemy skupić się na pisaniu kodu, który będzie składał się z następujących części:

  • Uzyskaj token autoryzacji.
  • Użyj tokenu do uwierzytelnienia.

Uzyskaj token autoryzacji

Aby uzyskać token, użyjemy Microsoft Authentication Library (MSAL) dla .NET.

Poniżej przedstawiono kroki uzyskania tokenu autoryzacji.

  • Dodaj pakiet NuGet Microsoft.Identity.Client która zawiera pliki binarne MSAL.NET.
  • Utwórz klasę AccessParameters do przechowywania poświadczeń.
  • Utwórz metodę przyjmującą parametry dostępu i używającą MSAL.NET do uzyskania tokenu dostępu.

Poniższe przykłady kodu będą zależeć od wybranego typu uwierzytelniania.

Uzyskaj token przy użyciu delegowanego uwierzytelniania

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

Uzyskaj token przy użyciu uwierzytelniania aplikacji

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

Uwierzytelnianie przy użyciu tokenu

Po tym, gdy pomyślnie uzyskamy token, zainicjalizujmy EwsClient.

Używanie tokenu z delegowanym uwierzytelnianiem

NetworkCredential credentials = new OAuthNetworkCredential(accessToken);

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

Używanie tokenu z uwierzytelnianiem aplikacji

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

Użyj Modern Authentication z klientami IMAP, POP lub SMTP

Dostęp IMAP, POP, SMTP przy użyciu uprawnień aplikacji nie jest obsługiwany. Innymi słowy, obsługiwane jest tylko uwierzytelnianie delegowane.

Procedura rejestracji aplikacji w Azure Active Directory jest określona powyżej.

Włącz lub wyłącz IMAP, POP, SMTP AUTH w Microsoft 365 Admin Center

  • Otwórz centrum administracyjne Microsoft 365 i przejdź do Users > Active users.
  • Wybierz użytkownika, a w wyświetlonym oknie kliknij Mail.
  • W sekcji Email apps kliknij Manage email apps.
  • Sprawdź ustawienie IMAP, POP, Authenticated SMTP: odznaczone = wyłączone, zaznaczone = włączone.
  • Kliknij Zapisz zmiany.

Pobierz token uwierzytelniający z serwera tokenów

Upewnij się, że określiłeś pełne zakresy, włączając URL zasobów Outlook.

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

Aby uzyskać token, użyjemy Microsoft Authentication Library (MSAL) dla .NET.

Poniżej przedstawiono kroki uzyskania tokenu autoryzacji.

  • Dodaj pakiet NuGet Microsoft.Identity.Client która zawiera pliki binarne MSAL.NET.
  • Utwórz klasę AccessParameters do przechowywania poświadczeń.
  • Utwórz metodę przyjmującą parametry dostępu i używającą MSAL.NET do uzyskania tokenu dostępu.
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;
}

Uwierzytelnij się przy użyciu tokenu

Po tym, gdy pomyślnie uzyskamy token, zainicjalizujmy ImapClient.

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

Podobnie, SmtpClient inicjalizacja będzie wyglądać następująco.

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

Zwróć identyfikator żądania klienta

Ten ReturnClientRequestId właściwość została dodana do EWSClient dla Twojej wygody, aby określić, czy identyfikator żądania klienta powinien być zwracany w odpowiedzi z wywołań Exchange Web Services (EWS). Identyfikator żądania klienta jest unikalnym identyfikatorem, który możesz ustawić dla każdego żądania EWS wysyłanego z Twojej aplikacji. Ustawiając ReturnClientRequestId ustawiając właściwość na true, wskazujesz, że identyfikator żądania klienta ma być zawarty w odpowiedzi serwera EWS. Może to być przydatne do śledzenia i kojarzenia żądań oraz odpowiedzi w scenariuszach, w których wiele żądań jest realizowanych asynchronicznie.

Poniższy fragment kodu pokazuje, jak można wykorzystać tę właściwość:

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

Dodaj X-AnchorMailbox i inne nagłówki do żądań EWS

API Aspose.Email umożliwia dodawanie nagłówków do żądań Exchange. Można to wykorzystać do dodawania nagłówków do żądań EWS w różnych celach. Przykładem może być dodanie nagłówka X-AnchorMailbox, który służy do zarządzania problemami z ograniczeniami (throttling) na serwerze Exchange. The AddHeader metoda IEWSClient jest używany do dodawania nagłówków do żądań EWS, jak pokazano w poniższym fragmencie kodu.

Ignoruj lub pomijaj nieprawidłowy lub wygasły certyfikat SSL

Aspose.Email może obsługiwać certyfikaty SSL na serwerze Exchange, używając zarówno ExchangeClient i EWSClient klas. Jeśli certyfikat SSL wygasł lub stał się nieprawidłowy, Aspose.Email zgłasza wyjątek z powodu nieprawidłowego certyfikatu SSL. Uniknij takich błędów certyfikatu SSL, ignorując je przy użyciu metody pokazanej w poniższym kodzie. Zarejestruj obsługę zwrotnego wywołania w metodzie main() lub init() i dodaj poniższą metodę jako członka klasy.