Trabajando con Carpetas en Exchange Server
Listado de todas las Carpetas del Servidor
Aspose.Email API proporciona la capacidad de conectarse al Exchange Server y listar todas las carpetas y subcarpetas. También puedes recuperar todas las subcarpetas de cada carpeta de manera recursiva. También ofrece la capacidad de enumerar carpetas con paginación desde el cliente de Exchange utilizando Exchange Web Service (EWS). Este artículo muestra cómo recuperar todas las subcarpetas del servidor Exchange y recuperar carpetas con paginación.
El siguiente fragmento de código muestra cómo listar carpetas desde el Exchange Server.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
public static void Run() | |
{ | |
try | |
{ | |
IEWSClient client = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain"); | |
Console.WriteLine("Downloading all messages from Inbox...."); | |
ExchangeMailboxInfo mailboxInfo = client.GetMailboxInfo(); | |
Console.WriteLine("Mailbox URI: " + mailboxInfo.MailboxUri); | |
string rootUri = client.GetMailboxInfo().RootUri; | |
// List all the folders from Exchange server | |
ExchangeFolderInfoCollection folderInfoCollection = client.ListSubFolders(rootUri); | |
foreach (ExchangeFolderInfo folderInfo in folderInfoCollection) | |
{ | |
// Call the recursive method to read messages and get sub-folders | |
ListSubFolders(client, folderInfo); | |
} | |
Console.WriteLine("All messages downloaded."); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine(ex.Message); | |
} | |
} | |
private static void ListSubFolders(IEWSClient client, ExchangeFolderInfo folderInfo) | |
{ | |
// Create the folder in disk (same name as on IMAP server) | |
Console.WriteLine(folderInfo.DisplayName); | |
try | |
{ | |
// If this folder has sub-folders, call this method recursively to get messages | |
ExchangeFolderInfoCollection folderInfoCollection = client.ListSubFolders(folderInfo.Uri); | |
foreach (ExchangeFolderInfo subfolderInfo in folderInfoCollection) | |
{ | |
ListSubFolders(client, subfolderInfo); | |
} | |
} | |
catch (Exception) | |
{ | |
} | |
} |
Obtener Información del Tipo de Carpeta usando EWS
La propiedad FolderType proporcionada por la clase ExchangeFolderInfo puede ser utilizada para obtener información sobre el tipo de carpeta. Se muestra en el siguiente ejemplo de código.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
const string mailboxUri = "https://exchange/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); | |
ExchangeFolderInfoCollection folderInfoCol = client.ListSubFolders(client.MailboxInfo.RootUri); | |
foreach (ExchangeFolderInfo folderInfo in folderInfoCol) | |
{ | |
switch (folderInfo.FolderType) | |
{ | |
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 utilizando EWS.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// 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().InboxUri); | |
int itemsPerPage = 5; | |
List<PageInfo> pages = new List<PageInfo>(); | |
PageInfo pagedMessageInfoCol = client.ListMessagesByPage(client.MailboxInfo.InboxUri, itemsPerPage); | |
pages.Add(pagedMessageInfoCol); | |
while (!pagedMessageInfoCol.LastPage) | |
{ | |
pagedMessageInfoCol = client.ListMessagesByPage(client.MailboxInfo.InboxUri, itemsPerPage); | |
pages.Add(pagedMessageInfoCol); | |
} | |
pagedMessageInfoCol = client.ListMessagesByPage(client.MailboxInfo.InboxUri, itemsPerPage); | |
while (!pagedMessageInfoCol.LastPage) | |
{ | |
client.ListMessages(client.MailboxInfo.InboxUri); | |
} | |
} | |
catch (Exception ex) | |
{ | |
Console.Write(ex.Message); | |
} | |
finally | |
{ | |
} |
Accediendo a Carpetas o Subcarpetas Personalizadas del Buzón
IEWSClient permite a los desarrolladores acceder a cualquier carpeta o subcarpeta personalizada del buzón. La función FolderExists() de IEWSClient devuelve el URI de una carpeta/subcarpeta personalizada especificada, que se puede usar para acceder a la carpeta de destino. En el siguiente ejemplo, se accede a una carpeta personalizada llamada “TestInbox”, que se crea bajo INBOX, y se muestran todos los mensajes de esta carpeta personalizada. Para realizar esta tarea, sigue los siguientes pasos:
- Inicializa el objeto IEWSClient proporcionando credenciales válidas.
- Accede al buzón predeterminado.
- Accede a la carpeta principal, que es INBOX en este ejemplo. Esta carpeta principal también puede ser una carpeta personalizada.
- Usa FolderExists() para buscar la subcarpeta personalizada especificada, por ejemplo “TestInbox”. Esto devolverá el URI de “TestInbox”.
- Usa este URI para acceder a todos los mensajes en esa carpeta personalizada.
El siguiente fragmento de código muestra cómo acceder a carpetas o subcarpetas personalizadas del buzón con EWS.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// 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 | |
client.FolderExists(mailbox.InboxUri, "TestInbox", out subfolderInfo); | |
//if custom folder exists | |
if (subfolderInfo != null) | |
{ | |
messages = client.ListMessages(subfolderInfo.Uri); | |
// Parse all the messages info collection | |
foreach (ExchangeMessageInfo info in messages) | |
{ | |
string strMessageURI = info.UniqueUri; | |
// now get the message details using FetchMessage() | |
MailMessage msg = client.FetchMessage(strMessageURI); | |
Console.WriteLine("Subject: " + msg.Subject); | |
} | |
} | |
else | |
{ | |
Console.WriteLine("No folder with this name found."); | |
} |
Listado de Carpetas Públicas
Microsoft Exchange Server permite a los usuarios crear carpetas públicas y publicar mensajes en ellas. Para hacerlo a través de tu aplicación, utiliza la clase Aspose.Email EWSClient para conectarte 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 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.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
public static string dataDir = RunExamples.GetDataDir_Exchange(); | |
public static string mailboxUri = "https://exchange/ews/exchange.asmx"; // EWS | |
public static string username = "administrator"; | |
public static string password = "pwd"; | |
public static string domain = "ex2013.local"; | |
public static void Run() | |
{ | |
try | |
{ | |
ReadPublicFolders(); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine(ex.Message); | |
} | |
} | |
private static void ReadPublicFolders() | |
{ | |
NetworkCredential credential = new NetworkCredential(username, password, domain); | |
IEWSClient client = EWSClient.GetEWSClient(mailboxUri, credential); | |
ExchangeFolderInfoCollection folders = client.ListPublicFolders(); | |
foreach (ExchangeFolderInfo publicFolder in folders) | |
{ | |
Console.WriteLine("Name: " + publicFolder.DisplayName); | |
Console.WriteLine("Subfolders count: " + publicFolder.ChildFolderCount); | |
ListMessagesFromSubFolder(publicFolder, client); | |
} | |
} | |
private static void ListMessagesFromSubFolder(ExchangeFolderInfo publicFolder, IEWSClient client) | |
{ | |
Console.WriteLine("Folder Name: " + publicFolder.DisplayName); | |
ExchangeMessageInfoCollection msgInfoCollection = client.ListMessagesFromPublicFolder(publicFolder); | |
foreach (ExchangeMessageInfo messageInfo in msgInfoCollection) | |
{ | |
MailMessage msg = client.FetchMessage(messageInfo.UniqueUri); | |
Console.WriteLine(msg.Subject); | |
msg.Save(dataDir + msg.Subject + ".msg", SaveOptions.DefaultMsgUnicode); | |
} | |
// Call this method recursively for any subfolders | |
if (publicFolder.ChildFolderCount > 0) | |
{ | |
ExchangeFolderInfoCollection subfolders = client.ListSubFolders(publicFolder); | |
foreach (ExchangeFolderInfo subfolder in subfolders) | |
{ | |
ListMessagesFromSubFolder(subfolder, client); | |
} | |
} | |
} |
Copiar un Mensaje a Otra Carpeta
Aspose.Email API permite copiar un mensaje de una carpeta a otra carpeta utilizando el método CopyItem. La versión sobrecargada de este método devuelve el URI Único del mensaje copiado como se muestra en este artículo.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
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 - " + Guid.NewGuid().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.MailboxInfo.DeletedItemsUri); | |
} | |
catch (Exception ex) | |
{ | |
Console.WriteLine(ex.Message); | |
} |
Sincronizando Elementos de Carpeta
Aspose.Email para .NET API IEWSClient interface proporciona la funcionalidad de sincronizar una carpeta de Exchange por su contenido. El método SyncFolder expuesto por la clase IEWSClient puede ser utilizado para realizar la sincronización de información de carpeta en una carpeta especificada. El siguiente fragmento de código muestra cómo sincronizar la información de la carpeta de Exchange.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
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 - " + Guid.NewGuid().ToString(), "EMAILNET-34738 Sync Folder Items"); | |
client.Send(message1); | |
MailMessage message2 = new MailMessage("user@domain.com", "user@domain.com", "EMAILNET-34738 - " + Guid.NewGuid().ToString(),"EMAILNET-34738 Sync Folder Items"); | |
client.Send(message2); | |
ExchangeMessageInfoCollection messageInfoCol = client.ListMessages(client.MailboxInfo.InboxUri); | |
SyncFolderResult result = client.SyncFolder(client.MailboxInfo.InboxUri, null); | |
Console.WriteLine(result.NewItems.Count); | |
Console.WriteLine(result.ChangedItems.Count); | |
Console.WriteLine(result.ReadFlagChanged.Count); | |
Console.WriteLine(result.DeletedItems.Length); |
Recuperando Permisos para Carpetas de 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. La clase ExchangeFolderPermission proporciona un conjunto de propiedades de permisos para carpetas de Exchange tales como el PermissionLevel, si pueden CanCreateItems, DeleteItems, y realizar otras tareas según lo especificado por las propiedades de permiso. Los permisos pueden ser recuperados utilizando el método GetFolderPermissions() 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:
- Inicializa el EWSClient.
- Usa el ListPublicFolders para obtener una lista de todas las carpetas públicas.
- Recupera los permisos asociados con una carpeta utilizando el método GetFolderPermisssions().
El siguiente fragmento de código muestra cómo usar la clase EWSClient para recuperar los permisos aplicados a una carpeta.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
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 | |
{ | |
foreach (ExchangeFolderInfo folderInfo in folders) | |
if (folderInfo.DisplayName.Equals(folderName)) | |
publicFolder = folderInfo; | |
if (publicFolder == null) | |
Console.WriteLine("public folder was not created in the root public folder"); | |
ExchangePermissionCollection folderPermissionCol = client.GetFolderPermissions(publicFolder.Uri); | |
foreach (ExchangeBasePermission perm in folderPermissionCol) | |
{ | |
ExchangeFolderPermission permission = perm as ExchangeFolderPermission; | |
if (permission == null) | |
Console.WriteLine("Permission is null."); | |
else | |
{ | |
Console.WriteLine("User's primary smtp address: {0}", permission.UserInfo.PrimarySmtpAddress); | |
Console.WriteLine("User can create Items: {0}", permission.CanCreateItems.ToString()); | |
Console.WriteLine("User can delete Items: {0}", permission.DeleteItems.ToString()); | |
Console.WriteLine("Is Folder Visible: {0}", permission.IsFolderVisible.ToString()); | |
Console.WriteLine("Is User owner of this folder: {0}", permission.IsFolderOwner.ToString()); | |
Console.WriteLine("User can read items: {0}", permission.ReadItems.ToString()); | |
} | |
} | |
ExchangeMailboxInfo mailboxInfo = client.GetMailboxInfo(); | |
//Get the Permissions for the Contacts and Calendar Folder | |
ExchangePermissionCollection contactsPermissionCol = client.GetFolderPermissions(mailboxInfo.ContactsUri); | |
ExchangePermissionCollection calendarPermissionCol = client.GetFolderPermissions(mailboxInfo.CalendarUri); | |
} | |
finally | |
{ | |
//Do the needfull | |
} |
Creando Carpetas y Subcarpetas
Aspose.Email API proporciona la capacidad de crear carpetas en un buzón de Exchange. El método CreateFolder de IEWSClient puede ser utilizado para este propósito. Para crear una carpeta en el buzón del servidor Exchange, se pueden seguir los siguientes pasos.
- Crea una instancia de IEWSClient.
- Establece 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.
- Usa el método CreateFolder para crear la carpeta.
El siguiente fragmento de código muestra cómo crear carpetas y subcarpetas.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
// 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.MailboxInfo.InboxUri; | |
string folderName1 = "EMAILNET-35054"; | |
string subFolderName0 = "2015"; | |
string folderName2 = folderName1 + "/" + subFolderName0; | |
string folderName3 = folderName1 + " / 2015"; | |
ExchangeFolderInfo rootFolderInfo = null; | |
ExchangeFolderInfo folderInfo = null; | |
try | |
{ | |
client.UseSlashAsFolderSeparator = true; | |
client.CreateFolder(client.MailboxInfo.InboxUri, folderName1); | |
client.CreateFolder(client.MailboxInfo.InboxUri, folderName2); | |
} | |
finally | |
{ | |
if (client.FolderExists(inbox, folderName1, out rootFolderInfo)) | |
{ | |
if (client.FolderExists(inbox, folderName2, out folderInfo)) | |
client.DeleteFolder(folderInfo.Uri, true); | |
client.DeleteFolder(rootFolderInfo.Uri, true); | |
} | |
} |
Respaldar Carpetas de Exchange a PST
A menudo sucede que los usuarios pueden querer hacer una copia de seguridad de todas o algunas de las carpetas del buzón. Aspose.Email proporciona la capacidad de hacer una copia de seguridad de todas o de las carpetas de buzón de Exchange especificadas a un PST. Este artículo describe cómo hacer una copia de seguridad de carpetas de Exchange a un PST con código de muestra. Para hacer la copia de seguridad de las carpetas del servidor Exchange, se pueden seguir los siguientes pasos.
- Inicia el IEWSClient con las credenciales del usuario.
- Agrega la información de la carpeta requerida a ExchangeFolderInfoCollection.
- Usa el método Backup del cliente para exportar el contenido de la carpeta a PST.
El siguiente fragmento de código muestra cómo respaldar carpetas de Exchange a PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET | |
string dataDir = RunExamples.GetDataDir_Exchange(); | |
// Create instance of IEWSClient class by providing credentials | |
const string mailboxUri = "https://ews.domain.com/ews/Exchange.asmx"; | |
const string domain = @""; | |
const string username = @"username"; | |
const 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.InboxUri); | |
ExchangeFolderInfoCollection fc = new ExchangeFolderInfoCollection(); | |
fc.Add(info); | |
client.Backup(fc, dataDir + "Backup_out.pst", BackupOptions.None); |