Verbindung zu Exchange Server mit EWS und IMAP herstellen
Um eine Verbindung zu Exchange‑Servern 2007, 2010 und 2013 über Exchange Web Service herzustellen, stellt Aspose.Email die IEWSClient Schnittstelle, die das EWSClient Klasse. Die EWSClient.GetEWSClient Methode erzeugt und gibt ein IEWSClient Objekt, das anschließend verwendet wird, um Vorgänge im Zusammenhang mit einem Exchange‑Postfach und anderen Ordnern auszuführen. Dieser Artikel zeigt, wie Objekte von IEWSClient.
Verbindung zum Exchange‑Server über EWS
Das folgende Code‑Snippet zeigt, wie Sie eine Verbindung über Exchange Web Service (EWS) herstellen:
// 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;
}
Benutzerdefinierte Header zur EWSClient‑Initialisierung hinzufügen
In Szenarien, in denen bei der Client‑Initialisierung bestimmte Header erforderlich sind, z. B. der X‑AnchorMailbox‑Header in EWS, verwenden Sie die folgenden überladenen Methoden, um beim Erzeugen einer Instanz benutzerdefinierte Header hinzuzufügen. IEWSClient:
-
IEWSClient GetEWSClient(string mailboxUri, ICredentials credentials, WebProxy proxy, Dictionary headers)
-
async Task GetEwsClientAsync(string mailboxUri, ICredentials credentials, WebProxy proxy, CancellationToken cancellationToken , Dictionary headers)
Das nachstehende Codebeispiel demonstriert, wie Sie den IEWSClient konfigurieren und initialisieren, während Sie benutzerdefinierte HTTP‑Header verwenden:
var headers = new Dictionary<string, string>();
headers.Add("X-AnchorMailbox", smtpExampleAddress);
IEWSClient client = EWSClient.GetEWSClient(HttpsExampleCom, new OAuthNetworkCredential("UserName", "Token"), null, headers);
Verbindung zum Exchange‑Server über IMAP
Microsoft Exchange Server unterstützt das IMAP‑Protokoll zum Zugriff auf Elemente in einem Postfach. Verwenden Sie Aspose.Email ImapClient Klasse, um über das IMAP‑Protokoll eine Verbindung zum Exchange‑Server herzustellen. Weitere Informationen zu ImapClient Klasse. Stellen Sie zuerst sicher, dass IMAP‑Dienste für Ihren Exchange‑Server aktiviert sind:
- Öffnen Sie die Systemsteuerung.
- Gehen Sie zu Administrator‑Tools und dann zu Diensten.
- Überprüfen Sie den Status des Microsoft Exchange IMAP4‑Dienstes.
- Falls es nicht bereits läuft, aktivieren/ starten Sie es.
Das folgende Code‑Snippet zeigt, wie man sich verbindet und Nachrichten aus dem Posteingangs‑Ordner eines Microsoft Exchange‑Servers über das IMAP‑Protokoll auflistet.
// 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();
Das folgende Code‑Snippet zeigt, wie man SSL verwendet.
// 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
}
Nach dem Verbinden mit einem Exchange‑Server über IMAP und dem Abrufen des IMapMessageInfoCollection, können Sie das MessageInfo Objekt. Das folgende Code‑Snippet zeigt, wie Sie die Sequenznummer des MessageInfo Objekt zum Speichern einer bestimmten Nachricht.
// 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);
}
Festlegen des bevorzugten Verschlüsselungsprotokolls
EWS verwendet das HTTPS‑Transportprotokoll für unterstützte Vorgänge. Die Verschlüsselung wird durch SSL/TLS‑Protokolle bereitgestellt. Diese Protokolle werden vom .NET‑Framework implementiert und können je nach aktueller .NET‑Framework‑Version unterschiedlich sein.
Um die SSL/TLS‑Version festzulegen, verwenden Sie den folgenden Code:
var client = new ImapClient("some.host");
client.SupportedEncryption = EncryptionProtocols.Tls13;
oder
var client = new ImapClient("some.host");
client.SetSupportedEncryptionUnsafe(EncryptionProtocols.Tls13);
Hinweis: Wenn das angegebene EncryptionProtocol von der aktuellen .NET‑Framework‑Version nicht unterstützt wird, die SupportedEncryption Eigenschaft degradierte das Verschlüsselungsprotokoll auf ein unterstütztes Niveau und das SetSupportedEncryptionUnsafe Methode wirft eine Ausnahme.
Verbindung zu Exchange Server mit moderner Authentifizierung herstellen
Moderne Authentifizierung ist nun standardmäßig für alle neuen Microsoft 365/Azure‑Mandanten aktiviert, da dieses Protokoll sicherer ist als die veraltete Basic‑Authentication.
Moderne Authentifizierung basiert auf der Active Directory Authentication Library und OAuth 2.0. Sie verwendet zeitlich begrenzte Tokens, und Anwendungen speichern keine Benutzeranmeldeinformationen.
Voraussetzungseinstellungen
Um Moderne Authentifizierung zu verwenden, stellen Sie sicher, dass sie aktiviert ist. Für Mandanten, die vor dem 1. August 2017 erstellt wurden, ist moderne Authentifizierung standardmäßig deaktiviert. In dem Microsoft 365 Admin‑Center, gehen Sie zu Einstellungen > Org‑Einstellungen > Moderne Authentifizierung. Im erscheinenden Modern Authentication‑Flyout können Sie die Protokolle erkennen, die keine Basic‑Authentifizierung mehr benötigen. Für neue Microsoft365‑Mandanten in Azure ist Basic‑Authentication standardmäßig für alle Anwendungen deaktiviert. Daher wird der Text in diesem Abschnitt angezeigt.
Ihre Organisation hat Sicherheitsstandards aktiviert, was bedeutet, dass moderne Authentifizierung für Exchange Online erforderlich ist und Verbindungen mit Basic‑Auth blockiert werden. > Sie müssen die Sicherheitsstandards im Azure‑Portal deaktivieren, bevor Sie hier Einstellungen ändern können.
Sie können die Unterstützung für Basic‑Auth für den Mandanten aktivieren über Azure Portal, gehen Sie zu Azure Active Directory > Eigenschaften > Sicherheitsstandards verwalten > Sicherheitsstandards aktivieren > Nein. Weitere Informationen finden Sie im Microsoft-Dokumentationsartikel.
App-Registrierung mit Azure Active Directory
Es ist notwendig, die App-Registrierung in Azure Active Directory durchzuführen. Es gibt zwei Arten von Berechtigungen, die zum Zugriff auf Postfächer mit Ihrer App verwendet werden können. Wählen Sie je nach zu erstellender App einen bestimmten Berechtigungstyp:
- Apps, die Delegierte Berechtigungen verwenden, haben einen angemeldeten Benutzer. Mit anderen Worten, beim Verbinden mit dem Dienst erscheint ein Dialogfenster für Benutzername und Passwort. Eine App kann niemals mehr Berechtigungen haben als ein angemeldeter Benutzer.
- Apps, die Anwendungsberechtigungen verwenden, laufen ohne einen angemeldeten Benutzer. Beispielsweise sind das Apps, die als Hintergrunddienste oder Daemons ausgeführt werden. Nur ein Administrator kann Anwendungsberechtigungen zustimmen.
Zusätzlich beziehen Sie sich auf die Microsoft-Dokumentationsartikel für weitere Informationen.
Der Registrierungsvorgang hängt von der ausgewählten Berechtigungsart ab. Um Ihre App zu registrieren, beziehen Sie sich auf die Microsoft-Dokumentationsartikel.
Moderne Authentifizierung mit EWSClient verwenden
Nach der Registrierung der Anwendung können wir uns auf das Schreiben des Codes konzentrieren, der aus den folgenden Teilen besteht:
- Holen Sie das Autorisierungstoken.
- Verwenden Sie das Token zur Authentifizierung.
Autorisierungstoken erhalten
Um das Token zu erhalten, verwenden wir Microsoft Authentication Library (MSAL) für .NET.
Im Folgenden finden Sie die Schritte zum Abrufen eines Autorisierungstokens.
- Fügen Sie das Microsoft.Identity.Client NuGet‑Paket die die Binärdateien von MSAL.NET enthält.
- Erstellen Sie eine AccessParameters‑Klasse zum Speichern von Anmeldeinformationen.
- Erstellen Sie eine Methode, die Zugriffsparameter akzeptiert und MSAL.NET verwendet, um ein Zugriffstoken zu erhalten.
Die folgenden Code‑Beispiele hängen von der gewählten Authentifizierungsart ab.
Ein Token mit delegierter Authentifizierung erhalten
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;
}
Ein Token mit App‑Authentifizierung erhalten
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;
}
Authentifizierung mit dem Token
Nachdem wir ein Token erfolgreich erhalten haben, initialisieren wir das EwsClient.
Verwendung des Tokens mit delegierter Authentifizierung
NetworkCredential credentials = new OAuthNetworkCredential(accessToken);
using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);
Verwendung des Tokens mit App‑Authentifizierung
// 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);
Moderne Authentifizierung mit IMAP‑, POP‑ oder SMTP‑Clients verwenden
Zugriff auf IMAP, POP, SMTP über Anwendungsberechtigungen wird nicht unterstützt. Mit anderen Worten, nur delegierte Authentifizierung wird unterstützt.
Der Ablauf zur App‑Registrierung mit Azure Active Directory ist definiert oben.
IMAP, POP, SMTP‑AUTH im Microsoft 365 Admin‑Center aktivieren oder deaktivieren
- Öffnen Sie die Microsoft 365 Admin‑Center und gehen Sie zu Benutzer > Aktive Benutzer.
- Wählen Sie den Benutzer aus und klicken Sie im erscheinenden Flyout auf Mail.
- Im Abschnitt E‑Mail‑Apps klicken Sie auf E‑Mail‑Apps verwalten.
- Überprüfen Sie die Einstellung IMAP, POP, Authenticated SMTP: deaktiviert = ausgeschaltet, aktiviert = eingeschaltet.
- Klicken Sie auf Änderungen speichern.
Authentifizierungstoken vom Token‑Server abrufen
Stellen Sie sicher, dass Sie die vollständigen Bereiche angeben, einschließlich der Outlook‑Ressourcen‑URLs.
IMAP: https://outlook.office.com/IMAP.AccessAsUser.All POP: https://outlook.office.com/POP.AccessAsUser.All SMTP: https://outlook.office.com/SMTP.Send
Um das Token zu erhalten, verwenden wir Microsoft Authentication Library (MSAL) für .NET.
Im Folgenden finden Sie die Schritte zum Abrufen eines Autorisierungstokens.
- Fügen Sie das Microsoft.Identity.Client NuGet‑Paket die die Binärdateien von MSAL.NET enthält.
- Erstellen Sie eine AccessParameters‑Klasse zum Speichern von Anmeldeinformationen.
- Erstellen Sie eine Methode, die Zugriffsparameter akzeptiert und MSAL.NET verwendet, um ein Zugriffstoken zu erhalten.
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;
}
Mit dem Token authentifizieren
Nachdem wir ein Token erfolgreich erhalten haben, initialisieren wir das ImapClient.
var imapClient = new ImapClient(
"outlook.office365.com",
993,
username,
accessToken,
true);
Ähnlich ist das SmtpClient Die Initialisierung sieht folgendermaßen aus.
var smtpClient = new SmtpClient(
"smtp.office365.com",
587,
username,
accessToken,
true);
Rückgabe der Client-Anforderungs-ID
Die ReturnClientRequestId Die Eigenschaft wurde zum EWSClient hinzugefügt, um Ihnen zu ermöglichen, anzugeben, ob die Client-Anforderungs-ID in der Antwort von Exchange Web Services (EWS)-Aufrufen zurückgegeben werden soll. Die Client-Anforderungs-ID ist ein eindeutiger Bezeichner, den Sie für jede von Ihrer Anwendung gesendete EWS-Anfrage festlegen können. Durch Festlegen der ReturnClientRequestId Setzen Sie die Eigenschaft auf true, um anzugeben, dass die Client‑Request‑ID in der Antwort des EWS‑Servers enthalten sein soll. Dies kann nützlich sein, um Anfragen und Antworten in Szenarien zu verfolgen und zu korrelieren, in denen mehrere Anfragen asynchron gestellt und verarbeitet werden.
Das folgende Code‑Snippet zeigt, wie die Eigenschaft verwendet werden kann:
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 und andere Header zu EWS‑Anfragen hinzufügen
Die Aspose.Email‑API ermöglicht das Hinzufügen von Headern zu Exchange‑Anfragen. Dies kann verwendet werden, um verschiedene Header zu den EWS‑Anfragen hinzuzufügen, die für unterschiedliche Zwecke genutzt werden können. Ein Beispiel ist das Hinzufügen des X‑AnchorMailbox‑Headers, der zur Bewältigung von Drosselungsproblemen auf dem Exchange‑Server verwendet wird. Der AddHeader Methode des IEWSClient wird verwendet, um Header zu den EWS‑Anfragen hinzuzufügen, wie im folgenden Code‑Snippet gezeigt.
Ungültiges oder abgelaufenes SSL-Zertifikat ignorieren oder umgehen
Aspose.Email kann SSL-Zertifikate auf dem Exchange Server mithilfe beider ExchangeClient und EWSClient Klassen. Wenn das SSL-Zertifikat abgelaufen oder ungültig ist, wirft Aspose.Email aufgrund eines ungültigen SSL-Zertifikats eine Ausnahme. Vermeiden Sie solche SSL-Zertifikatfehler, indem Sie sie mit der unten gezeigten Methode ignorieren. Registrieren Sie den Callback-Handler in Ihrer main()- oder init()-Methode und fügen Sie die untenstehende Methode als Mitglied der Klasse hinzu.