Se connecter au serveur Exchange en utilisant EWS et IMAP
Afin de se connecter aux serveurs Exchange 2007, 2010 et 2013 en utilisant Exchange Web Service, Aspose.Email fournit le IEWSClient interface qui implémente le EWSClient classe. Le EWSClient.GetEWSClient la méthode instancie et renvoie un IEWSClient objet qui est ensuite utilisé pour effectuer des opérations liées à une boîte aux lettres Exchange et à d’autres dossiers. Cet article montre comment instancier des objets de IEWSClient.
Connexion au serveur Exchange via EWS
L’extrait de code suivant montre comment établir une connexion en utilisant 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;
}
Ajouter des en‑têtes personnalisés à l’initialisation d’EWSClient
Dans les scénarios où des en‑têtes spécifiques sont requis lors de l’initialisation du client, comme l’en‑tête X-AnchorMailbox dans EWS, utilisez les méthodes surchargées suivantes pour ajouter des en‑têtes personnalisés lors de la création d’une instance de IEWSClient:
-
IEWSClient GetEWSClient(string mailboxUri, ICredentials credentials, WebProxy proxy, Dictionary headers)
-
async Task GetEwsClientAsync(string mailboxUri, ICredentials credentials, WebProxy proxy, CancellationToken cancellationToken , Dictionary headers)
L’exemple de code ci‑dessous montre comment configurer et initialiser le IEWSClient tout en utilisant des en‑têtes HTTP personnalisés :
var headers = new Dictionary<string, string>();
headers.Add("X-AnchorMailbox", smtpExampleAddress);
IEWSClient client = EWSClient.GetEWSClient(HttpsExampleCom, new OAuthNetworkCredential("UserName", "Token"), null, headers);
Connexion au serveur Exchange via IMAP
Microsoft Exchange Server prend en charge le protocole IMAP pour accéder aux éléments d’une boîte aux lettres. Utilisez Aspose.Email ImapClient classe pour se connecter au serveur Exchange en utilisant le protocole IMAP. Pour plus d’informations sur le ImapClient classe. Tout d’abord, assurez-vous que les services IMAP sont activés pour votre serveur Exchange :
- Ouvrez le Panneau de configuration.
- Allez dans Outils d’administration, puis Services.
- Vérifiez l’état du service Microsoft Exchange IMAP4.
- S’il n’est pas déjà en cours d’exécution, activez/le démarrez.
Le fragment de code suivant montre comment se connecter et lister les messages du dossier Boîte de réception d’un serveur Microsoft Exchange en utilisant le protocole 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();
Le fragment de code suivant montre comment utiliser 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
}
Après s’être connecté à un serveur Exchange en utilisant IMAP et avoir récupéré le IMapMessageInfoCollection, vous pouvez obtenir le MessageInfo objet. L’extrait de code suivant montre comment utiliser le numéro de séquence du MessageInfo objet pour enregistrer un message spécifique.
// 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);
}
Définir le protocole de chiffrement préféré
EWS utilise le protocole de transport HTTPS pour les opérations prises en charge. Le chiffrement est fourni par les protocoles SSL/TLS. Ces protocoles sont implémentés par le framework .NET et peuvent varier selon la version actuelle du framework .NET.
Pour définir la version SSL/TLS, utilisez le code suivant :
var client = new ImapClient("some.host");
client.SupportedEncryption = EncryptionProtocols.Tls13;
ou
var client = new ImapClient("some.host");
client.SetSupportedEncryptionUnsafe(EncryptionProtocols.Tls13);
Remarque : si le protocole de chiffrement spécifié n’est pas pris en charge par la version actuelle du framework .NET, le SupportedEncryption la propriété rétrograde le protocole de chiffrement à un niveau pris en charge et le SetSupportedEncryptionUnsafe la méthode lève une exception.
Se connecter au serveur Exchange en utilisant l’authentification moderne
L’authentification moderne est désormais activée par défaut pour tous les nouveaux locataires Microsoft 365/Azure car ce protocole est plus sécurisé que l’authentification de base, désormais obsolète.
L’authentification moderne repose sur la bibliothèque d’authentification d’Active Directory et OAuth 2.0. Elle utilise des jetons à durée limitée, et les applications ne stockent pas les informations d’identification des utilisateurs.
Paramètres prérequis
Pour utiliser l’authentification moderne, assurez‑vous qu’elle est activée. Cependant, pour les locataires créés avant le 1 août 2017, l’authentification moderne est désactivée par défaut. Dans le Centre d’administration Microsoft 365, allez Paramètres > Paramètres d’organisation > Authentification moderne. Dans le volet Authentification moderne qui apparaît, vous pouvez identifier les protocoles ne nécessitant plus l’authentification de base. Pour les nouveaux locataires Microsoft 365 dans Azure, l’authentification de base est désactivée par défaut pour toutes les applications. Ainsi, le texte sera affiché dans cette section.
Votre organisation a les paramètres de sécurité par défaut activés, ce qui signifie que l’authentification moderne pour Exchange Online est requise, et les connexions d’authentification de base sont bloquées. > Vous devez désactiver les paramètres de sécurité par défaut dans le portail Azure avant de pouvoir modifier les paramètres ici.
Vous pouvez activer le support de l’authentification de base pour le locataire depuis le Azure dans le portail, allez Azure Active Directory > Propriétés > Gérer les paramètres de sécurité > Activer les paramètres de sécurité > Non. Pour plus d’informations, consultez le Article de documentation Microsoft.
Enregistrement d’application avec Azure Active Directory
Il est nécessaire d’effectuer l’enregistrement de l’application avec Azure Active Directory. Il existe deux types d’autorisations pouvant être utilisées pour accéder aux boîtes aux lettres avec votre application. Choisissez un type d’autorisation spécifique, selon l’application que vous créez :
- Les applications qui utilisent les autorisations déléguées ont un utilisateur connecté. En d’autres termes, lorsqu’on se connecte au service, une fenêtre de dialogue apparaît pour le nom d’utilisateur et le mot de passe. Une application ne peut jamais avoir plus de privilèges qu’un utilisateur connecté.
- Les applications qui utilisent les autorisations d’application s’exécutent sans utilisateur connecté. Par exemple, ce sont des applications qui fonctionnent comme services en arrière‑plan ou démons. Seul un administrateur peut consentir aux autorisations d’application.
De plus, référez‑vous au Article de documentation Microsoft pour plus d’informations.
La procédure d’enregistrement dépend du type d’autorisation sélectionné. Pour enregistrer votre application, consultez le Article de documentation Microsoft.
Utiliser l’authentification moderne avec EWSClient
Après avoir enregistré l’application, nous pouvons nous concentrer sur l’écriture du code, qui comprendra les parties suivantes :
- Obtenez le jeton d’autorisation.
- Utiliser le jeton pour s’authentifier.
Obtenir le jeton d’autorisation
Pour obtenir le jeton, nous utiliserons Bibliothèque d’authentification Microsoft (MSAL) pour .NET.
Voici les étapes pour obtenir le jeton d’autorisation.
- Ajouter le Package NuGet Microsoft.Identity.Client qui contient les binaires de MSAL.NET.
- Créer une classe AccessParameters pour stocker les identifiants.
- Créer une méthode acceptant des paramètres d’accès et utilisant MSAL.NET pour obtenir un jeton d’accès.
Les extraits de code suivants dépendront du type d’authentification choisi.
Obtenir un jeton avec une authentification délégée
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;
}
Obtenir un jeton avec une authentification d’application
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;
}
Authentification avec le jeton
Après cela, lorsque nous avons obtenu un jeton avec succès, initialisons le EwsClient.
Utiliser le jeton avec une authentification délégée
NetworkCredential credentials = new OAuthNetworkCredential(accessToken);
using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);
Utiliser le jeton avec une authentification d’application
// 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);
Utiliser l’authentification moderne avec les clients IMAP, POP ou SMTP
L’accès IMAP, POP, SMTP via des autorisations d’application n’est pas pris en charge. En d’autres termes, seule l’authentification déléguée est supportée.
La procédure d’enregistrement d’application avec Azure Active Directory est définie ci‑dessus.
Activer ou désactiver IMAP, POP, SMTP AUTH dans le centre d’administration Microsoft 365
- Ouvrez le Centre d’administration Microsoft 365 et allez dans Utilisateurs > Utilisateurs actifs.
- Sélectionnez l’utilisateur, et dans le volet qui apparaît, cliquez sur Mail.
- Dans la section Applications de messagerie, cliquez sur Gérer les applications de messagerie.
- Vérifiez le paramètre IMAP, POP, SMTP authentifié : décoché = désactivé, coché = activé.
- Cliquez sur Enregistrer les modifications.
Récupérer le jeton d’authentification depuis le serveur de jetons
Assurez‑vous de spécifier les étendues complètes, y compris les URL des ressources Outlook.
IMAP: https://outlook.office.com/IMAP.AccessAsUser.All POP: https://outlook.office.com/POP.AccessAsUser.All SMTP: https://outlook.office.com/SMTP.Send
Pour obtenir le jeton, nous utiliserons Bibliothèque d’authentification Microsoft (MSAL) pour .NET.
Voici les étapes pour obtenir le jeton d’autorisation.
- Ajouter le Package NuGet Microsoft.Identity.Client qui contient les binaires de MSAL.NET.
- Créer une classe AccessParameters pour stocker les identifiants.
- Créer une méthode acceptant des paramètres d’accès et utilisant MSAL.NET pour obtenir un jeton d’accès.
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;
}
Authentifier avec le jeton
Après cela, lorsque nous avons obtenu un jeton avec succès, initialisons le ImapClient.
var imapClient = new ImapClient(
"outlook.office365.com",
993,
username,
accessToken,
true);
De même, le SmtpClient l’initialisation sera la suivante.
var smtpClient = new SmtpClient(
"smtp.office365.com",
587,
username,
accessToken,
true);
Retourner l’ID de requête client
Le ReturnClientRequestId une propriété a été ajoutée à EWSClient pour votre commodité afin de spécifier si l’ID de requête client doit être renvoyé dans la réponse des appels aux services Web Exchange (EWS). L’ID de requête client est un identifiant unique que vous pouvez définir pour chaque requête EWS envoyée depuis votre application. En définissant le ReturnClientRequestId en réglant la propriété sur true, vous indiquez que vous souhaitez que l’ID de la requête client soit inclus dans la réponse du serveur EWS. Cela peut être utile pour suivre et corréler les requêtes et réponses dans les scénarios où plusieurs requêtes sont effectuées et traitées de manière asynchrone.
L’extrait de code suivant montre comment la propriété peut être utilisée :
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();
}
Ajouter X-AnchorMailbox et d’autres en‑têtes aux requêtes EWS
L’API Aspose.Email permet d’ajouter des en‑têtes aux requêtes Exchange. Cela peut être utilisé pour ajouter des en‑têtes aux requêtes EWS pour différents usages. Un exemple pourrait être l’ajout de l’en‑tête X-AnchorMailbox qui est utilisé pour gérer les problèmes de limitation sur le serveur Exchange. Le AddHeader méthode du IEWSClient est utilisé pour ajouter des en‑têtes aux requêtes EWS comme le montre l’extrait de code suivant.
Ignorer ou contourner le certificat SSL invalide ou expiré
Aspose.Email peut gérer les certificats SSL sur Exchange Server en utilisant les deux ExchangeClient et EWSClient classes. Si le certificat SSL a expiré ou est devenu invalide, Aspose.Email lève une exception en raison d’un certificat SSL invalide. Évitez de telles erreurs de certificat SSL en les ignorant à l’aide de la méthode présentée dans le code ci‑dessous. Enregistrez le gestionnaire de rappel dans votre méthode main() ou init() et ajoutez la méthode ci‑dessous en tant que membre de la classe.