Trabajando con carpetas en Exchange Server
Listando todas las carpetas del servidor
La API Aspose.Email brinda la capacidad de conectarse al Exchange Server y listar todas las carpetas y subcarpetas. También puede recuperar todas las subcarpetas de cada carpeta de forma recursiva. Además, ofrece la capacidad de enumerar carpetas con paginación desde el cliente Exchange usando Exchange Web Service (EWS). Este artículo muestra cómo recuperar todas las subcarpetas del servidor Exchange y obtener carpetas con paginación.
El siguiente fragmento de código le muestra cómo listar carpetas del Exchange Server.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
try {
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
System.out.println("Downloading all messages from Inbox....");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
System.out.println("Mailbox URI: " + mailboxInfo.getMailboxUri());
String rootUri = client.getMailboxInfo().getRootUri();
// List all the folders from Exchange server
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(rootUri);
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
// Call the recursive method to read messages and get sub-folders
listSubFolders(client, folderInfo);
}
System.out.println("All messages downloaded.");
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
private static void listSubFolders(IEWSClient client, ExchangeFolderInfo folderInfo) {
// Create the folder in disk (same name as on IMAP server)
System.out.println(folderInfo.getDisplayName());
try {
// If this folder has sub-folders, call this method recursively to get messages
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(folderInfo.getUri());
for (ExchangeFolderInfo subfolderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
listSubFolders(client, subfolderInfo);
}
} catch (java.lang.RuntimeException e) {
}
}
Obtener información del tipo de carpeta usando EWS
El FolderType propiedad proporcionada por ExchangeFolderInfo La clase puede usarse para obtener información sobre el tipo de la carpeta. Esto se muestra en el ejemplo de código a continuación.
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credentials);
ExchangeFolderInfoCollection folderInfoCol = client.listSubFolders(client.getMailboxInfo().getRootUri());
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCol) {
switch (folderInfo.getFolderType()) {
case ExchangeFolderType.Appointment:
// handle Appointment
break;
case ExchangeFolderType.Contact:
// handle Contact
break;
case ExchangeFolderType.Task:
// handle Task
break;
case ExchangeFolderType.Note:
// handle email message
break;
case ExchangeFolderType.StickyNote:
// handle StickyNote
break;
case ExchangeFolderType.Journal:
// handle Journal
break;
default:
break;
}
}
Enumerando carpetas con soporte de paginación usando EWS
El siguiente fragmento de código muestra cómo usar el soporte de paginación con EWS.
// Create instance of ExchangeWebServiceClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "UserName", "Password");
// Call ListMessages method to list messages info from Inbox
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
int itemsPerPage = 5;
List<PageInfo> pages = new ArrayList<PageInfo>();
PageInfo pagedMessageInfoCol = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
pages.add(pagedMessageInfoCol);
while (!pagedMessageInfoCol.getLastPage()) {
pagedMessageInfoCol = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
pages.add(pagedMessageInfoCol);
}
pagedMessageInfoCol = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
while (!pagedMessageInfoCol.getLastPage()) {
client.listMessages(client.getMailboxInfo().getInboxUri());
}
Accediendo a carpetas personalizadas del buzón o subcarpetas
IEWSClient permite a los desarrolladores acceder a cualquier carpeta o subcarpeta personalizada del buzón. El folderExists() función de IEWSClient devuelve el URI de una carpeta/subcarpeta personalizada especificada, que luego puede usarse para acceder a la carpeta objetivo. En el siguiente ejemplo, se accede a una carpeta personalizada llamada "TestInbox", que está creada bajo INBOX, y se muestran todos los mensajes de esta carpeta personalizada. Para realizar esta tarea, los pasos son los siguientes:
- Inicialice el objeto IEWSClient proporcionando credenciales válidas.
- Acceda al buzón predeterminado.
- Acceda a la carpeta padre, que es INBOX en este ejemplo. Esta carpeta padre también puede ser una carpeta personalizada.
- Use folderExists() para buscar la subcarpeta personalizada especificada, por ejemplo "TestInbox". Devolverá el URI de "TestInbox".
- Utilice este URI para acceder a todos los mensajes en esa carpeta personalizada.
El siguiente fragmento de código muestra cómo acceder a carpetas personalizadas del buzón o subcarpetas con EWS.
// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Create ExchangeMailboxInfo, ExchangeMessageInfoCollection instance
ExchangeMailboxInfo mailbox = client.getMailboxInfo();
ExchangeMessageInfoCollection messages = null;
ExchangeFolderInfo subfolderInfo = new ExchangeFolderInfo();
// Check if specified custom folder exisits and Get all the messages info from the target Uri
ExchangeFolderInfo[] referenceToSubfolderInfo = { subfolderInfo };
client.folderExists(mailbox.getInboxUri(), "TestInbox", /* out */ referenceToSubfolderInfo);
subfolderInfo = referenceToSubfolderInfo[0];
// if custom folder exists
if (subfolderInfo != null) {
messages = client.listMessages(subfolderInfo.getUri());
// Parse all the messages info collection
for (ExchangeMessageInfo info : (Iterable<ExchangeMessageInfo>) messages) {
String strMessageURI = info.getUniqueUri();
// now get the message details using FetchMessage()
MailMessage msg = client.fetchMessage(strMessageURI);
System.out.println("Subject: " + msg.getSubject());
}
} else {
System.out.println("No folder with this name found.");
}
Listando 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 Aspose.Email’s EWSClient clase para conectarse al Exchange Server y leer y descargar mensajes y publicaciones de carpetas públicas. El siguiente fragmento de código muestra cómo leer todas las carpetas públicas y subcarpetas, y enumerar 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("Name: " + publicFolder.getDisplayName());
System.out.println("Subfolders count: " + publicFolder.getChildFolderCount());
listMessagesFromSubFolder(publicFolder, client);
}
}
private static void listMessagesFromSubFolder(ExchangeFolderInfo publicFolder, IEWSClient client) {
System.out.println("Folder Name: " + 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());
}
// Call this method recursively for any subfolders
if (publicFolder.getChildFolderCount() > 0) {
ExchangeFolderInfoCollection subfolders = client.listSubFolders(publicFolder);
for (ExchangeFolderInfo subfolder : (Iterable<ExchangeFolderInfo>) subfolders) {
listMessagesFromSubFolder(subfolder, client);
}
}
}
Copiar un mensaje a otra carpeta
La API Aspose.Email permite copiar un mensaje de una carpeta a otra usando el copyItem método. La versión sobrecargada de este método devuelve el URI único del mensaje copiado como se muestra en este artículo.
try {
// Create instance of EWSClient class by giving credentials
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: Copy a message and get reference to the new Copy item");
String messageUri = client.appendMessage(message);
String newMessageUri = client.copyItem(messageUri, client.getMailboxInfo().getDeletedItemsUri());
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
Sincronizando elementos de carpeta
APIs de Aspose.Email para Java IEWSClient proporciona la función de sincronizar una carpeta Exchange para su contenido. El syncFolder método expuesto por el IEWSClient La clase puede usarse para realizar la sincronización de información de carpetas en una carpeta especificada. El siguiente fragmento de código muestra cómo sincronizar la información de la carpeta Exchange.
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
MailMessage message1 = new MailMessage("user@domain.com", "user@domain.com", "EMAILNET-34738 - " + UUID.randomUUID().toString(), "EMAILNET-34738 Sync Folder Items");
client.send(message1);
MailMessage message2 = new MailMessage("user@domain.com", "user@domain.com", "EMAILNET-34738 - " + UUID.randomUUID().toString(), "EMAILNET-34738 Sync Folder Items");
client.send(message2);
ExchangeMessageInfoCollection messageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
SyncFolderResult result = client.syncFolder(client.getMailboxInfo().getInboxUri(), null);
System.out.println(result.getNewItems().size());
System.out.println(result.getChangedItems().size());
System.out.println(result.getReadFlagChanged().size());
System.out.println(result.getDeletedItems().length);
Recuperando permisos para carpetas Exchange
A los usuarios se les asignan permisos a carpetas públicas en Exchange Server, lo que limita/determina el nivel de acceso que un usuario tiene a estas carpetas. El ExchangeFolderPermission clase que proporciona un conjunto de propiedades de permiso para carpetas Exchange, como el PermissionLevel, si pueden canCreateItems, deleteItems, y realizar otras tareas según lo especificado por las propiedades de permiso. Los permisos pueden recuperarse usando el getFolderPermissions() método de IEWSClient. Este artículo muestra cómo recuperar los permisos aplicados a una carpeta pública para todos los usuarios que tienen acceso a las carpetas compartidas.
Para realizar esta tarea:
- Inicialice el EWSClient.
- Utilice listPublicFolders para obtener una lista de todas las carpetas públicas
- Recuperar los permisos asociados a una carpeta usando el método getFolderPermissions()
El siguiente fragmento de código muestra cómo usar el EWSClient clase para recuperar los permisos aplicados a una carpeta.
String folderName = "DesiredFolderName";
// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
ExchangeFolderInfoCollection folders = client.listPublicFolders();
ExchangeFolderPermissionCollection permissions = new ExchangeFolderPermissionCollection();
ExchangeFolderInfo publicFolder = null;
try {
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folders)
if (folderInfo.getDisplayName().equals(folderName))
publicFolder = folderInfo;
if (publicFolder == null)
System.out.println("public folder was not created in the root public folder");
ExchangePermissionCollection folderPermissionCol = client.getFolderPermissions(publicFolder.getUri());
for (ExchangeBasePermission perm : (Iterable<ExchangeBasePermission>) folderPermissionCol) {
if (perm instanceof ExchangeFolderPermission)
System.out.println("Permission is null.");
else {
ExchangeFolderPermission permission = (ExchangeFolderPermission) perm;
System.out.println("User's primary smtp address: " + permission.getUserInfo().getPrimarySmtpAddress());
System.out.println("User can create Items: " + permission.canCreateItems());
System.out.println("User can delete Items: " + permission.getDeleteItems());
System.out.println("Is Folder Visible: " + permission.isFolderVisible());
System.out.println("Is User owner of this folder: " + permission.isFolderOwner());
System.out.println("User can read items: " + permission.getReadItems());
}
}
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
// Get the Permissions for the Contacts and Calendar Folder
ExchangePermissionCollection contactsPermissionCol = client.getFolderPermissions(mailboxInfo.getContactsUri());
ExchangePermissionCollection calendarPermissionCol = client.getFolderPermissions(mailboxInfo.getCalendarUri());
} finally {
// Do the needfull
}
Creando carpetas y subcarpetas
La API Aspose.Email proporciona la capacidad de crear carpetas en un buzón Exchange. El CreateFolder método de IEWSClient puede usarse para este propósito. Para crear una carpeta en el buzón del servidor Exchange, se pueden seguir los siguientes pasos.
- Cree una instancia de IEWSClient.
- Establezca la propiedad UseSlashAsFolderSeparator según sea necesario. Si se establece en true, la aplicación considerará la "barra" como separador de carpetas y la subcarpeta se creará después de la barra.
- Use el método createFolder para crear la carpeta.
El siguiente fragmento de código muestra cómo crear carpetas y subcarpetas.
// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
String inbox = client.getMailboxInfo().getInboxUri();
String folderName1 = "EMAILNET-35054";
String subFolderName0 = "2015";
String folderName2 = folderName1 + "/" + subFolderName0;
String folderName3 = folderName1 + " / 2015";
ExchangeFolderInfo rootFolderInfo = null;
ExchangeFolderInfo folderInfo = null;
try {
client.setUseSlashAsFolderSeparator(true);
client.createFolder(client.getMailboxInfo().getInboxUri(), folderName1);
client.createFolder(client.getMailboxInfo().getInboxUri(), folderName2);
} finally {
ExchangeFolderInfo[] referenceToRootFolderInfo = { rootFolderInfo };
boolean outRefCondition0 = client.folderExists(inbox, folderName1, /* out */ referenceToRootFolderInfo);
rootFolderInfo = referenceToRootFolderInfo[0];
if (outRefCondition0) {
ExchangeFolderInfo[] referenceToFolderInfo = { folderInfo };
boolean outRefCondition1 = client.folderExists(inbox, folderName2, /* out */ referenceToFolderInfo);
folderInfo = referenceToFolderInfo[0];
if (outRefCondition1)
client.deleteFolder(folderInfo.getUri(), true);
client.deleteFolder(rootFolderInfo.getUri(), true);
}
}
Respaldar carpetas de Exchange a PST
A menudo ocurre que los usuarios quieran hacer una copia de seguridad de todas o de algunas carpetas del buzón. Aspose.Email proporciona la capacidad de respaldar todas o carpetas específicas del buzón Exchange a un PST. Este artículo describe cómo respaldar carpetas de Exchange a un PST con código de ejemplo. Para respaldar las carpetas del servidor Exchange, se pueden seguir los siguientes pasos.
- Inicie el IEWSClient con credenciales de usuario
- Agregue la información de la carpeta requerida a ExchangeFolderInfoCollection
- Use el método de copia de seguridad del cliente para exportar el contenido de la carpeta a PST
El siguiente fragmento de código muestra cómo hacer una copia de seguridad de carpetas de Exchange a PST.
String dataDir = "data/";
// Create instance of IEWSClient class by providing credentials
final String mailboxUri = "https://ews.domain.com/ews/Exchange.asmx";
final String domain = "";
final String username = "username";
final String password = "password";
NetworkCredential credential = new NetworkCredential(username, password, domain);
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);
// Get Exchange mailbox info of other email account
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
ExchangeFolderInfo info = client.getFolderInfo(mailboxInfo.getInboxUri());
ExchangeFolderInfoCollection fc = new ExchangeFolderInfoCollection();
fc.addItem(info);
client.backup(fc, dataDir + "Backup_out.pst", BackupOptions.None);