Trabajar con Buzones de Exchange y Mensajes - Leer Correo Electrónico desde el Servidor de Exchange en Java
Obteniendo Información del Buzón Usando EWS
La clase EWSClient tiene miembros que se pueden usar para obtener información del buzón de un Servidor Exchange mediante la llamada al método IEWSClient.getMailboxInfo(). Devuelve una instancia del tipo ExchangeMailboxInfo. Obtenga información del buzón a partir de propiedades como MailboxUri, InboxUri y DraftsUri. Este artículo muestra cómo acceder a la información del buzón utilizando Servicios Web de Exchange.
Si desea conectarse al Servidor de Exchange utilizando Servicios Web de Exchange (EWS), use la clase EWSClient. Esta clase usa EWS para conectarse y administrar elementos en un Servidor Exchange. El siguiente fragmento de código Java le muestra cómo obtener información del buzón usando los servicios web de exchange.
// Crear instancia de la clase EWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Obtener tamaño del buzón, información del buzón de exchange, URI del buzón y carpeta de entrada
System.out.println("Tamaño del buzón: " + client.getMailboxSize() + " bytes");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
System.out.println("URI del buzón: " + mailboxInfo.getMailboxUri());
System.out.println("URI de la carpeta de entrada: " + mailboxInfo.getInboxUri());
System.out.println("URI de elementos enviados: " + mailboxInfo.getSentItemsUri());
System.out.println("URI de la carpeta de borradores: " + mailboxInfo.getDraftsUri());
Enviando Mensajes de Correo Electrónico
Puede enviar mensajes de correo electrónico utilizando un Servidor Exchange con la ayuda de las herramientas en Aspose.Email.Exchange. El método IEWSClient.Send() acepta una instancia de MailMessage como parámetro y envía el correo electrónico. Este artículo explica cómo enviar mensajes de correo electrónico utilizando Servicios Web de Exchange.
Aspose.Email proporciona la clase IEWSClient para conectarse al Servidor Microsoft Exchange usando Servicios Web de Exchange. El siguiente fragmento de código muestra cómo usar EWS para enviar correos electrónicos utilizando el Servidor Microsoft Exchange. El siguiente fragmento de código Java muestra cómo enviar mensajes de correo electrónico utilizando EWS.
// Crear instancia de la clase IEWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Crear instancia del tipo MailMessage
MailMessage msg = new MailMessage();
msg.setFrom(MailAddress.to_MailAddress("sender@domain.com"));
msg.setTo(MailAddressCollection.to_MailAddressCollection("recipient@ domain.com "));
msg.setSubject("Enviando mensaje desde el servidor de exchange");
msg.setHtmlBody("<h3>enviando mensaje desde el servidor de exchange</h3>");
// Enviar el mensaje
client.send(msg);
Obteniendo la Clase de Mensaje
El método getMessageClass() de la clase ExchangeMessageInfo obtiene una cadena que representa la clase para el mensaje. El siguiente ejemplo de código muestra cómo obtener la clase de mensaje:
try (IEWSClient client = EWSClient.getEWSClient(uri, credentials))
{
ExchangeMessageInfoCollection messageInfoCollection = client.listMessagesFromPublicFolder(publicFolder);
for (ExchangeMessageInfo messageInfo : messageInfoCollection)
{
System.out.println("Clase del Mensaje: " + messageInfo.getMessageClass());
}
}
Leyendo Correos Electrónicos del Buzón de Otro Usuario
Algunas cuentas en Servidores Exchange tienen el derecho de acceder a múltiples buzones, y algunos usuarios tienen múltiples cuentas de correo electrónico en el mismo Servidor Exchange. En ambos casos, los usuarios pueden acceder a los buzones de otros usuarios utilizando Aspose.Email para Java. Esta API proporciona un mecanismo para acceder a carpetas y correos electrónicos de otros buzones usando la clase IEWSClient. Esta funcionalidad se puede lograr utilizando el método sobrecargado getMailboxInfo() y proporcionando la dirección de correo electrónico del usuario como parámetro.
El siguiente fragmento de código le muestra cómo leer correos electrónicos usando la clase IEWSClient.
// Crear instancia de la clase EWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Obtener información del buzón de otro cuenta de email
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo("otherUser@domain.com");
Listando Mensajes
Una lista de los mensajes de correo electrónico en un buzón de Exchange se puede obtener llamando al método IEWSClient.listMessages. Obtenga la información básica sobre los mensajes, como el asunto, de, para y ID del mensaje, utilizando el método listMessages.
Listando Mensajes Simples
Para listar los mensajes en un buzón de Exchange:
- Cree una instancia de la clase IEWSClient.
- Llame al método listMessages y cree una colección de mensajes.
- Recorra la colección y muestre la información del mensaje.
El siguiente fragmento de código Java le muestra cómo conectarse a un servidor de exchange utilizando EWS y listar mensajes de la carpeta de entrada.
// Crear instancia de la clase ExchangeWebServiceClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "UserName", "Password");
// Llamar al método ListMessages para listar la información de los mensajes desde la carpeta de entrada
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Recorrer la colección para mostrar la información básica
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
System.out.println("Asunto: " + msgInfo.getSubject());
System.out.println("De: " + msgInfo.getFrom().toString());
System.out.println("Para: " + msgInfo.getTo().toString());
System.out.println("ID del Mensaje: " + msgInfo.getMessageId());
System.out.println("URI Única: " + msgInfo.getUniqueUri());
}
Listando Mensajes desde Diferentes Carpetas
Los fragmentos de código anteriores listan todos los mensajes en la carpeta de entrada. También es posible obtener la lista de mensajes de otras carpetas. El método IEWSClient.listMessages() acepta una URI de carpeta como parámetro. Siempre que la URI de la carpeta sea válida, puede obtener la lista de mensajes de esa carpeta. Use la propiedad IEWSClient.getMailboxInfo().getXXXFolderUri para obtener la URI de diferentes carpetas. El resto del código es el mismo que para obtener una lista de mensajes. El siguiente fragmento de código le muestra cómo listar mensajes de diferentes carpetas usando EWS.
// Crear instancia de la clase EWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Obtener URI de la carpeta
String strFolderURI = "";
strFolderURI = client.getMailboxInfo().getInboxUri();
strFolderURI = client.getMailboxInfo().getDeletedItemsUri();
strFolderURI = client.getMailboxInfo().getDraftsUri();
strFolderURI = client.getMailboxInfo().getSentItemsUri();
// Obtener lista de mensajes de la carpeta específica
ExchangeMessageInfoCollection msgCollection = client.listMessages(strFolderURI);
Listando Mensajes con Soporte de Paginación
El siguiente fragmento de código Java le muestra cómo obtener una lista de mensajes con soporte de paginación.
// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-email/Aspose.Email-for-Java
final IEWSClient client = EWSClient.getEWSClient("exchange.domain.com", "username", "password");
try {
try {
// Crear algunos mensajes de prueba para ser añadidos al servidor para su recuperación posterior
int messagesNum = 12;
int itemsPerPage = 5;
MailMessage message = null;
for (int i = 0; i < messagesNum; i++) {
message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35157_1 - " + UUID.randomUUID().toString(),
"EMAILNET-35157 Mover parámetros de paginación a una clase separada");
client.appendMessage(client.getMailboxInfo().getInboxUri(), message);
}
// Verifique que los mensajes han sido añadidos al servidor
ExchangeMessageInfoCollection totalMessageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
System.out.println(totalMessageInfoCol.size());
////////////////// RECUPERANDO LOS MENSAJES USANDO SOPORTE DE PAGINACIÓN ////////////////////////////////////
List<ExchangeMessagePageInfo> pages = new ArrayList<ExchangeMessagePageInfo>();
ExchangeMessagePageInfo pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
// Total de Páginas Contadas
System.out.println(pageInfo.getTotalCount());
pages.add(pageInfo);
while (!pageInfo.getLastPage()) {
pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage, pageInfo.getPageOffset() + 1);
pages.add(pageInfo);
}
int retrievedItems = 0;
// conversión de foreach a while
for (ExchangeMessagePageInfo pageCol : pages) {
retrievedItems += pageCol.getItems().size();
}
// Verifique el recuento total de mensajes usando paginación
System.out.println(retrievedItems);
} finally {
}
} finally {
client.dispose();
}
Obteniendo Información del Tipo de Mensaje desde ExchangeMessageInfo
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credentials);
ExchangeMessageInfoCollection list = client.listMessages(client.getMailboxInfo().getDeletedItemsUri());
System.out.println(list.get_Item(0).getMessageInfoType()); // MessageInfoType
Guardando Mensajes
Este artículo muestra cómo obtener mensajes de un buzón del Servidor Exchange y guardarlos en el disco en formatos EML y MSG:
- Guardar como EML en el disco.
- Guardar en un flujo de memoria.
- Guardar como MSG.
Guardando Mensajes en EML
Para obtener mensajes y guardarlos en formato EML:
- Crear una instancia de la clase IEWSClient.
- Proporcionar la mailboxUri, nombre de usuario, contraseña y dominio.
- Llamar al método IEWSClient.listMessages() para obtener una instancia de la colección ExchangeMessagesInfoCollection.
- Recorrer la colección ExchangeMessagesInfoCollection para obtener la URI única para cada mensaje.
- Llamar al método IEWSClient.saveMessage() y pasar la URI única como parámetro.
- Proporcionar al método saveMessage() una ruta donde desea guardar el archivo.
El siguiente fragmento de código le muestra cómo usar EWS para conectarse al Servidor Exchange y guardar mensajes como archivos EML.
// Crear instancia de la clase IEWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Llamar al método ListMessages para listar la información de los mensajes desde la carpeta de entrada
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Recorrer la colección para obtener la URI del Mensaje
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
String strMessageURI = msgInfo.getUniqueUri();
// Ahora guardar el mensaje en el disco
client.saveMessage(strMessageURI, dataDir + msgInfo.getMessageId() + "out.eml");
}
Guardando Mensajes en un Flujo de Memoria
En lugar de guardar archivos EML en el disco, es posible guardarlos en un flujo de memoria. Esto es útil cuando desea guardar el flujo en algún lugar de almacenamiento como una base de datos. Una vez que el flujo ha sido guardado en una base de datos, puede recargar el archivo EML en la clase MailMessage. El siguiente fragmento de código le muestra cómo guardar mensajes de un buzón del Servidor Exchange en un flujo de memoria usando EWS.
// Crear instancia de la clase EWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Llamar al método ListMessages para listar la información de los mensajes desde la carpeta de entrada
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Recorrer la colección para obtener la URI del Mensaje
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
String strMessageURI = msgInfo.getUniqueUri();
// Ahora guardar el mensaje en un flujo de memoria
ByteArrayOutputStream stream = new ByteArrayOutputStream();
client.saveMessage(strMessageURI, stream);
}
Guardando Mensajes en Formato MSG
El método IEWSClient.saveMessage() puede guardar directamente el mensaje en formato EML. Para guardar los mensajes en formato MSG, primero llame al método IEWSClient.fetchMessage() que devuelve una instancia de la clase MailMessage. Luego llame al método MailMessage.save() para guardar el mensaje como MSG. El siguiente fragmento de código le muestra cómo obtener mensajes de un buzón del Servidor Exchange y guardarlos en formato MSG usando EWS.
// Crear instancia de la clase EWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Llamar al método ListMessages para listar la información de los mensajes desde la carpeta de entrada
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
int count = 0;
// Recorrer la colección para obtener la URI del Mensaje
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
String strMessageURI = msgInfo.getUniqueUri();
// Ahora obtener los detalles del mensaje usando FetchMessage() y guardar el mensaje como Msg
MailMessage message = client.fetchMessage(strMessageURI);
message.save(dataDir + (count++) + "_out.msg", SaveOptions.getDefaultMsgUnicode());
}
Obteniendo ExchangeMessageInfo desde URI del Mensaje
Un mensaje de correo electrónico está representado por su identificador único, URI, y es parte integral del objeto ExchangeMessageInfo. En caso de que solo esté disponible la URI del mensaje, entonces el objeto ExchangeMessageInfo también se puede recuperar usando esta información disponible. La versión sobrecargada de listMessages toma una lista de Ids para usar ExchangeMessageInfoCollection. El siguiente fragmento de código le muestra cómo obtener ExchangeMessageInfo desde la URI del mensaje.
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "user@domain.com", "pwd", "domain");
List<String> ids = new ArrayList<String>();
List<MailMessage> messages = new ArrayList<MailMessage>();
for (int i = 0; i < 5; i++) {
MailMessage message = new MailMessage("user@domain.com", "receiver@domain.com", "EMAILNET-35033 - " + UUID.randomUUID().toString(),
"EMAILNET-35033 Los mensajes guardados de la carpeta de Elementos Enviados no contienen el campo 'Para'");
messages.add(message);
String uri = client.appendMessage(message);
ids.add(uri);
}
ExchangeMessageInfoCollection messageInfoCol = client.listMessages(ids);
for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) messageInfoCol) {
// Hacer algo ...
System.out.println(messageInfo.getUniqueUri());
}
Recuperar Mensajes de un Buzón del Servidor Exchange
Listar Mensajes en un Servidor Exchange usó el método listMessages() para obtener una lista de mensajes de un buzón del Servidor Exchange. El método listMessages() obtiene información básica sobre los mensajes, por ejemplo, el asunto, el ID del mensaje, de y para. Para obtener los detalles completos del mensaje, Aspose.Email.Exchange proporciona el método IEWSClient.fetchMessage(). Este método acepta la URI del mensaje como parámetro y devuelve una instancia de la clase MailMessage. La clase MailMessage luego proporciona detalles del mensaje como cuerpo, encabezados y adjuntos. Descubra más sobre la API de MailMessage, o averigüe cómo administrar correos electrónicos con la clase MailMessage. Para recuperar mensajes del Buzón del Servidor Exchange:
- Cree una instancia del tipo IEWSClient.
- Especifique el nombre del servidor, nombre de usuario, contraseña y dominio.
- Llame a listMessages para obtener la ExchangeMessageInfoCollection.
- Recorra la colección ExchangeMessageInfoCollection para obtener los valores de ExchangeMessageInfo.UniqueURI.
- Llame a IEWSClient.fetchMessage() y pase ExchangeMessageInfo.UniqueURI como parámetro.
El siguiente fragmento de código le muestra cómo conectarse al buzón del Servidor Exchange y recuperar todos los mensajes usando EWS.
// Crear instancia de la clase ExchangeWebServiceClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Llamar al método ListMessages para listar la información de los mensajes desde la carpeta de entrada
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Recorrer la colección para obtener la URI del Mensaje
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
String strMessageURI = msgInfo.getUniqueUri();
// Ahora obtener los detalles del mensaje utilizando FetchMessage()
MailMessage msg = client.fetchMessage(strMessageURI);
for (Attachment att : (Iterable<Attachment>) msg.getAttachments()) {
System.out.println("Nombre del Adjuntado: " + att.getName());
}
}
Usando el método FetchItem para recuperar un mensaje
El método FetchItem es más preferido si desea recuperar un MapiMessage y operar con propiedades MAPI. También puede usar este método para recuperar cualquier elemento de Outlook, como un contacto, cita, tarea, etc.
// Crear instancia de la clase ExchangeWebServiceClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Llamar al método ListMessages para listar la información de los mensajes desde la carpeta de entrada
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Recorrer la colección para obtener la URI del Mensaje
for (ExchangeMessageInfo msgInfo : msgCollection)
{
// Ahora obtener el mensaje usando FetchItem()
MapiMessage msg = client.fetchItem(msgInfo.getUniqueUri());
// Si es necesario, puede convertir el MapiMessage al tipo de item correcto para simplificar el trabajo con sus propiedades.
MapiContact contact = (MapiContact) msg.toMapiMessageItem();
}
Tamaño de Mensaje Pre-Fetch
Microsoft Outlook InterOp proporciona la función de recuperar el tamaño del mensaje antes de recuperar realmente el mensaje completo del servidor. En el caso de la API de Aspose.Email, la información de resumen recuperada del servidor Exchange está representada por la clase ExchangeMessageInfo. Proporciona la misma función de recuperar el tamaño del mensaje usando la propiedad Size. Para recuperar el tamaño del mensaje, se utiliza la llamada estándar al método listMessages de IEWSClient que recupera una colección de ExchangeMessageInfo. El siguiente fragmento de código le muestra cómo mostrar el tamaño del mensaje utilizando la clase ExchangeMessageInfo.
// Crear instancia de la clase ExchangeWebServiceClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Llamar al método ListMessages para listar la información de los mensajes desde la carpeta de entrada
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
// Recorrer la colección para mostrar la información básica
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgCollection) {
System.out.println("Asunto: " + msgInfo.getSubject());
System.out.println("De: " + msgInfo.getFrom().toString());
System.out.println("Para: " + msgInfo.getTo().toString());
System.out.println("Tamaño del Mensaje: " + msgInfo.getSize());
System.out.println("==================================");
}
Descargar Mensajes Recursivamente
El método listSubFolders() de EWSClient se puede usar para obtener mensajes de carpetas y subcarpetas de un buzón del Servidor Exchange de forma recursiva. Esto requiere Exchange Server 2007 o superior, ya que utiliza EWS. El siguiente fragmento de código le muestra cómo descargar todo el buzón (carpetas y subcarpetas) de un Servidor Exchange. La estructura de carpetas se crea localmente y todos los mensajes se descargan.
public static void run() {
try {
downloadAllMessages();
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
private static void downloadAllMessages() {
try {
String rootFolder = domain + "-" + username;
new File(rootFolder).mkdirs();
String inboxFolder = rootFolder + "\\Inbox";
new File(inboxFolder).mkdirs();
System.out.println("Descargando todos los mensajes de la carpeta de entrada....");
// Crear instancia de la clase IEWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", username, password, domain);
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
System.out.println("URI del buzón: " + mailboxInfo.getMailboxUri());
String rootUri = client.getMailboxInfo().getRootUri();
// Listar todas las carpetas desde el servidor Exchange
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(rootUri);
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
// Llamar al método recursivo para leer mensajes y obtener subcarpetas
listMessagesInFolder(client, folderInfo, rootFolder);
}
System.out.println("Todos los mensajes descargados.");
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
// Método recursivo para obtener mensajes de carpetas y subcarpetas
private static void listMessagesInFolder(IEWSClient client, ExchangeFolderInfo folderInfo, String rootFolder) {
// Crear la carpeta en el disco (mismo nombre que en el servidor IMAP)
String currentFolder = rootFolder + "\\" + folderInfo.getDisplayName();
new File(currentFolder).mkdirs();
// Listar mensajes
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(folderInfo.getUri());
System.out.println("Listando mensajes....");
int i = 0;
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
// Obtener asunto y otras propiedades del mensaje
System.out.println("Asunto: " + msgInfo.getSubject());
// Eliminar caracteres como ? y :, que no deberían incluirse en el nombre de un archivo
String fileName = msgInfo.getSubject().replace("?", " ").replace(":", " ");
MailMessage msg = client.fetchMessage(msgInfo.getUniqueUri());
msg.save(dataDir + "\\" + fileName + "-" + i + ".msg");
i++;
}
System.out.println("============================\n");
try {
// Si esta carpeta tiene subcarpetas, llamar a este método recursivamente para obtener mensajes
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(folderInfo.getUri());
for (ExchangeFolderInfo subfolderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
listMessagesInFolder(client, subfolderInfo, currentFolder);
}
} catch (java.lang.RuntimeException e) {
}
}
Descargar Mensajes de Carpetas Públicas
Microsoft Exchange Server permite a los usuarios crear carpetas públicas y publicar mensajes en ellas. Para hacer esto a través de su aplicación, use la clase EWSClient de Aspose.Email para conectarse al Servidor Exchange y leer y descargar mensajes y publicaciones de carpetas públicas. El siguiente fragmento de código le muestra cómo leer todas las carpetas públicas, y subcarpetas, y listar y descargar cualquier mensaje encontrado en estas carpetas. Este ejemplo solo funciona con Microsoft Exchange Server 2007 o superior ya que solo estos soportan EWS.
public static void run() {
try {
readPublicFolders();
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
private static void readPublicFolders() {
NetworkCredential credential = new NetworkCredential(username, password, domain);
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);
ExchangeFolderInfoCollection folders = client.listPublicFolders();
for (ExchangeFolderInfo publicFolder : (Iterable<ExchangeFolderInfo>) folders) {
System.out.println("Nombre: " + publicFolder.getDisplayName());
System.out.println("Cantidad de Subcarpetas: " + publicFolder.getChildFolderCount());
listMessagesFromSubFolder(publicFolder, client);
}
}
private static void listMessagesFromSubFolder(ExchangeFolderInfo publicFolder, IEWSClient client) {
System.out.println("Nombre de la Carpeta: " + publicFolder.getDisplayName());
ExchangeMessageInfoCollection msgInfoCollection = client.listMessagesFromPublicFolder(publicFolder);
for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) msgInfoCollection) {
MailMessage msg = client.fetchMessage(messageInfo.getUniqueUri());
System.out.println(msg.getSubject());
msg.save(dataDir + msg.getSubject() + ".msg", SaveOptions.getDefaultMsgUnicode());
}
// Llamar a este método recursivamente para cualquier subcarpeta
if (publicFolder.getChildFolderCount() > 0) {
ExchangeFolderInfoCollection subfolders = client.listSubFolders(publicFolder);
for (ExchangeFolderInfo subfolder : (Iterable<ExchangeFolderInfo>) subfolders) {
listMessagesFromSubFolder(subfolder, client);
}
}
}
Moviendo Mensajes
Puede mover mensajes de correo electrónico de una carpeta a otra con la ayuda del método move de la clase IEWSClient. Toma como parámetros:
- La URI única del mensaje que se va a mover.
- La URI única de la carpeta de destino.
Moviendo Mensajes entre Carpetas
El siguiente fragmento de código le muestra cómo mover un mensaje en un buzón de la carpeta de entrada a una carpeta llamada Procesados. En este ejemplo, la aplicación:
- Lee mensajes de la carpeta de entrada.
- Procesa algunos de los mensajes según ciertos criterios (en este ejemplo, encontramos una palabra clave en el asunto del mensaje).
- Mueve los mensajes que cumplen la condición dada a la carpeta procesada.
// Crear instancia de la clase IEWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
// Listar todos los mensajes desde la carpeta de entrada
System.out.println("Listando todos los mensajes desde la carpeta de entrada....");
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(mailboxInfo.getInboxUri());
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
// Mover mensaje a la carpeta "Procesados", después de procesar ciertos mensajes según ciertos criterios
if (msgInfo.getSubject() != null && msgInfo.getSubject().toLowerCase().contains("procesar este mensaje")) {
client.moveItem(mailboxInfo.getDeletedItemsUri(), msgInfo.getUniqueUri()); // EWS
System.out.println("Mensaje movido...." + msgInfo.getSubject());
} else {
// Hacer algo más
}
}
Eliminando Mensajes
Puede eliminar mensajes de correo electrónico de una carpeta con la ayuda del método deleteItem de la clase IEWSClient. Toma la URI única del mensaje como parámetro.
El siguiente fragmento de código le muestra cómo eliminar un mensaje de la carpeta de entrada. Con el propósito de este ejemplo, el código:
- Lee mensajes de la carpeta de entrada.
- Procesa mensajes según ciertos criterios (en este ejemplo, encontramos una palabra clave en el asunto del mensaje).
- Elimina el mensaje.
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
// Listar todos los mensajes desde la carpeta de entrada
System.out.println("Listando todos los mensajes desde la carpeta de entrada....");
ExchangeMessageInfoCollection msgInfoColl = client.listMessages(mailboxInfo.getInboxUri());
for (ExchangeMessageInfo msgInfo : (Iterable<ExchangeMessageInfo>) msgInfoColl) {
// Eliminar mensaje según ciertos criterios
if (msgInfo.getSubject() != null && msgInfo.getSubject().toLowerCase().contains("eliminar") == true) {
client.deleteItem(msgInfo.getUniqueUri(), DeletionOptions.getDeletePermanently()); // EWS
System.out.println("Mensaje eliminado...." + msgInfo.getSubject());
} else {
// Hacer algo más
}
}
Copiando Mensajes
La API de Aspose.Email permite copiar un mensaje de una carpeta a otra utilizando el método copyItem. La versión sobrecargada de este método devuelve la URI Única del mensaje copiado como se muestra en este artículo.
Copiando un Mensaje a Otra Carpeta
El siguiente fragmento de código le muestra cómo copiar un mensaje a otra carpeta.
try {
// Crear instancia de la clase EWSClient proporcionando credenciales
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
MailMessage message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-34997 - " + UUID.randomUUID().toString(),
"EMAILNET-34997 Exchange: Copiar un mensaje y obtener referencia al nuevo elemento Copiado");
String messageUri = client.appendMessage(message);
String newMessageUri = client.copyItem(messageUri, client.getMailboxInfo().getDeletedItemsUri());
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}