Conectar al Exchange Server usando EWS e IMAP
Para conectarse a los servidores Exchange 2007, 2010 y 2013 usando Exchange Web Service, Aspose.Email proporciona el IEWSClient interfaz que implementa el EWSClient clase. El EWSClient.GetEWSClient el método instancia y devuelve un IEWSClient objeto que se utiliza posteriormente para realizar operaciones relacionadas con un buzón Exchange y otras carpetas. Este artículo muestra cómo instanciar objetos de IEWSClient.
Conectándose a Exchange Server usando EWS
El siguiente fragmento de código le muestra cómo establecer una conexión usando 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;
}
Agregar encabezados personalizados a la inicialización de EWSClient
En escenarios donde se requieren encabezados específicos durante la inicialización del cliente, como el encabezado X-AnchorMailbox en EWS, use los siguientes métodos sobrecargados para agregar encabezados personalizados al crear una instancia 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)
El ejemplo de código a continuación demuestra cómo configurar e inicializar el IEWSClient mientras se utilizan encabezados HTTP personalizados:
var headers = new Dictionary<string, string>();
headers.Add("X-AnchorMailbox", smtpExampleAddress);
IEWSClient client = EWSClient.GetEWSClient(HttpsExampleCom, new OAuthNetworkCredential("UserName", "Token"), null, headers);
Conectándose a Exchange Server usando IMAP
Microsoft Exchange Server soporta el protocolo IMAP para acceder a los elementos de un buzón. Use Aspose.Email ImapClient clase para conectarse al Exchange Server usando el protocolo IMAP. Para más información sobre el ImapClient clase. Primero, asegúrese de que los servicios IMAP estén habilitados para su Exchange Server:
- Abra el Panel de control.
- Vaya a Herramientas de administrador, luego a Servicios.
- Verifique el estado del servicio Microsoft Exchange IMAP4.
- Si no está en ejecución, habilítelo/inícielo.
El siguiente fragmento de código muestra cómo conectarse y listar mensajes de la carpeta Bandeja de entrada de Microsoft Exchange Server usando el protocolo 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();
El siguiente fragmento de código muestra cómo usar 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
}
Después de conectarse a un servidor Exchange usando IMAP y obtener el IMapMessageInfoCollection, puede obtener el MessageInfo objeto. El siguiente fragmento de código le muestra cómo usar el número de secuencia del MessageInfo objeto para guardar un mensaje específico.
// 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);
}
Configurando el protocolo de cifrado preferido
EWS usa el protocolo de transporte HTTPS para operaciones soportadas. El cifrado lo proporcionan los protocolos SSL/TLS. Estos protocolos están implementados por el framework .NET y pueden variar según la versión actual del framework .NET.
Para establecer la versión SSL/TLS use el siguiente código:
var client = new ImapClient("some.host");
client.SupportedEncryption = EncryptionProtocols.Tls13;
o
var client = new ImapClient("some.host");
client.SetSupportedEncryptionUnsafe(EncryptionProtocols.Tls13);
Nota, si el EncryptionProtocol especificado no es compatible con la versión actual del framework .NET, el SupportedEncryption la propiedad degrada el protocolo de cifrado a un nivel compatible y el SetSupportedEncryptionUnsafe el método lanza una excepción.
Conectar a Exchange Server usando autenticación moderna
La autenticación moderna ahora está habilitada por defecto para todos los nuevos inquilinos de Microsoft 365/Azure porque este protocolo es más seguro que la autenticación básica obsoleta.
La autenticación moderna se basa en la biblioteca Active Directory Authentication Library y OAuth 2.0. Utiliza tokens con tiempo limitado, y las aplicaciones no almacenan credenciales de usuario.
Configuraciones previas
Para usar la autenticación moderna, asegúrese de que esté habilitada. Sin embargo, para inquilinos creados antes del 1 de agosto de 2017, la autenticación moderna está desactivada por defecto. En el Centro de administración de Microsoft 365, vaya a Settings > Org Settings > Modern Authentication. En el Modern authentication flyout que aparece, puede identificar los protocolos que ya no requieren autenticación básica. Para nuevos inquilinos de Microsoft365 en Azure, la autenticación básica está deshabilitada por defecto para todas las aplicaciones. Por lo tanto, el texto se mostrará en esta sección.
Su organización tiene habilitados los valores predeterminados de seguridad, lo que significa que la autenticación moderna a Exchange Online es obligatoria y las conexiones de autenticación básica están bloqueadas. > Debe desactivar los valores predeterminados de seguridad en el portal de Azure antes de poder cambiar cualquier configuración aquí.
Puede habilitar el soporte de autenticación básica para el inquilino desde el Azure portal, vaya a Azure Active Directory > Properties > Manage Security defaults > Enable Security defaults > No. Para más información, vea el Artículo de documentación de Microsoft.
Registro de aplicación con Azure Active Directory
Es necesario realizar el registro de la aplicación en Azure Active Directory. Hay dos tipos de permisos que pueden usarse para acceder a los buzones con su aplicación. Elija un tipo específico de permiso, según la aplicación que esté creando:
- Las aplicaciones que usan Delegated permissions tienen un usuario conectado presente. En otras palabras, cuando se conecta al servicio, aparece una ventana de diálogo para un nombre de usuario y una contraseña. La aplicación nunca puede tener más privilegios que un usuario conectado.
- Las aplicaciones que usan Application permissions se ejecutan sin que haya un usuario conectado. Por ejemplo, estas son aplicaciones que se ejecutan como servicios en segundo plano o demonios. Sólo un administrador puede dar su consentimiento a los permisos de aplicación.
Además, consulte el Artículo de documentación de Microsoft para más información.
El procedimiento de registro depende del tipo de permiso seleccionado. Para registrar su aplicación, consulte el Artículo de documentación de Microsoft.
Usar autenticación moderna con EWSClient
Después de registrar la aplicación, podemos centrarnos en escribir el código, que consistirá en las siguientes partes:
- Obtener el token de autorización.
- Usar el token para autenticarse.
Obtener token de autorización
Para obtener el token usaremos Microsoft Authentication Library (MSAL) para .NET.
Los siguientes son los pasos para obtener el token de autorización.
- Añada el Paquete NuGet Microsoft.Identity.Client que contiene los binarios de MSAL.NET.
- Crear una clase AccessParameters para almacenar credenciales.
- Crear un método que acepte parámetros de acceso y use MSAL.NET para obtener un token de acceso.
Los siguientes ejemplos de código dependerán del tipo de autenticación elegido.
Obtener un token con autenticación delegada
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;
}
Obtener un token con autenticación de aplicación
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;
}
Autenticando con el token
Después de eso, cuando hayamos obtenido exitosamente un token, vamos a inicializar el EwsClient.
Usando el token con autenticación delegada
NetworkCredential credentials = new OAuthNetworkCredential(accessToken);
using var client = EWSClient.GetEWSClient("https://outlook.office365.com/EWS/Exchange.asmx", credentials);
Usando el token con autenticación de aplicación
// 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);
Usar autenticación moderna con clientes IMAP, POP o SMTP
El acceso a IMAP, POP, SMTP mediante permisos de aplicación no está soportado. En otras palabras, sólo se admite la autenticación delegada.
El procedimiento de registro de la aplicación con Azure Active Directory está definido arriba.
Habilitar o deshabilitar IMAP, POP, SMTP AUTH en el Centro de administración de Microsoft 365
- Abra el Centro de administración de Microsoft 365 y vaya a Users > Active users.
- Seleccione al usuario y, en la ventana emergente que aparece, haga clic en Mail.
- En la sección Email apps, haga clic en Manage email apps.
- Verifique la configuración IMAP, POP, SMTP autenticado: sin marcar = deshabilitado, marcado = habilitado.
- Haga clic en Guardar cambios.
Recuperar token de autenticación del servidor de tokens
Asegúrese de especificar los ámbitos completos, incluidas las URL de recursos de Outlook.
IMAP: https://outlook.office.com/IMAP.AccessAsUser.All POP: https://outlook.office.com/POP.AccessAsUser.All SMTP: https://outlook.office.com/SMTP.Send
Para obtener el token usaremos Microsoft Authentication Library (MSAL) para .NET.
Los siguientes son los pasos para obtener el token de autorización.
- Añada el Paquete NuGet Microsoft.Identity.Client que contiene los binarios de MSAL.NET.
- Crear una clase AccessParameters para almacenar credenciales.
- Crear un método que acepte parámetros de acceso y use MSAL.NET para obtener un token de acceso.
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;
}
Autenticar con el token
Después de eso, cuando hayamos obtenido exitosamente un token, vamos a inicializar el ImapClient.
var imapClient = new ImapClient(
"outlook.office365.com",
993,
username,
accessToken,
true);
De manera similar, el SmtpClient la inicialización se verá como sigue.
var smtpClient = new SmtpClient(
"smtp.office365.com",
587,
username,
accessToken,
true);
Devolver el ID de Solicitud del Cliente
El ReturnClientRequestId Se agregó una propiedad a EWSClient para su conveniencia, que permite especificar si el ID de solicitud del cliente debe devolverse en la respuesta de las llamadas a Exchange Web Services (EWS). El ID de solicitud del cliente es un identificador único que puede establecer para cada solicitud EWS enviada desde su aplicación. Al establecer la ReturnClientRequestId establecer la propiedad a true, indica que desea que el ID de solicitud del cliente se incluya en la respuesta del servidor EWS. Esto puede ser útil para rastrear y correlacionar solicitudes y respuestas en escenarios donde se realizan y procesan múltiples solicitudes de forma asíncrona.
El siguiente fragmento de código muestra cómo se puede utilizar la propiedad:
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();
}
Agregar X-AnchorMailbox y otros encabezados a las solicitudes EWS
La API Aspose.Email permite agregar encabezados a las solicitudes de Exchange. Esto puede usarse para añadir encabezados a las solicitudes EWS para diferentes propósitos. Un ejemplo de esto podría ser agregar el encabezado X-AnchorMailbox que se usa para gestionar los problemas de limitación en el servidor Exchange. El AddHeader método del IEWSClient se usa para agregar encabezados a las solicitudes EWS como se muestra en el siguiente fragmento de código.
Ignorar o Omitir Certificado SSL Inválido o Expirado
Aspose.Email puede manejar certificados SSL en Exchange Server usando ambos los ExchangeClient y EWSClient clases. Si el certificado SSL ha expirado o se ha vuelto inválido, Aspose.Email lanza una excepción debido a un certificado SSL inválido. Evite dichos errores de certificado SSL ignorándolos usando el método usado en el código a continuación. Registre el manejador de devolución de llamada en su método main() o init() y añada el método a continuación como miembro de la clase.