Trabalhando com Pastas no Exchange Server

Listando todas as Pastas do Servidor

A API Aspose.Email fornece a capacidade de se conectar ao Exchange Server e listar todas as pastas e subpastas. Você também pode recuperar todas as subpastas de cada pasta recursivamente. Ela também fornece a capacidade de enumerar pastas com paginação a partir do cliente Exchange usando o Exchange Web Service (EWS). Este artigo mostra como recuperar todas as subpastas do servidor Exchange e como recuperar pastas com paginação.

O seguinte trecho de código mostra como listar pastas do 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)
{
}
}

Obter Informações sobre o Tipo de Pasta usando EWS

A propriedade FolderType fornecida pela classe ExchangeFolderInfo pode ser usada para obter informações sobre o tipo da pasta. Isso é mostrado no exemplo de código abaixo.

// 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 Pastas com Suporte a Paginação usando EWS

O seguinte trecho de código mostra como usar o suporte a paginação usando 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
{
}

Acessando Pastas Personalizadas ou Subpastas da Caixa de Correio

IEWSClient permite que os desenvolvedores acessem qualquer pasta personalizada ou subpasta da caixa de correio. A função FolderExists() da classe IEWSClient retorna o URI de uma pasta/subpasta personalizada especificada, que pode ser usada para acessar a pasta desejada. No exemplo a seguir, uma pasta personalizada chamada “TestInbox”, que é criada sob a INBOX, é acessada e todas as mensagens são exibidas dessa pasta personalizada. Para realizar essa tarefa, siga os seguintes passos:

  1. Inicialize o objeto IEWSClient fornecendo credenciais válidas.
  2. Acesse a caixa de correio padrão.
  3. Acesse a pasta pai, que é a INBOX neste exemplo. Essa pasta pai também pode ser uma pasta personalizada.
  4. Use FolderExists() para pesquisar a subpasta personalizada especificada, por exemplo “TestInbox”. Ele retornará o URI de “TestInbox”.
  5. Use este URI para acessar todas as mensagens nessa pasta personalizada.

O seguinte trecho de código mostra como acessar pastas personalizadas ou subpastas da caixa de correio com 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.");
}

Listando Pastas Públicas

O Microsoft Exchange Server permite que os usuários criem pastas públicas e publiquem mensagens nelas. Para fazer isso através de seu aplicativo, use a classe Aspose.Email EWSClient para se conectar ao Exchange Server e ler e baixar mensagens e postagens de pastas públicas. O seguinte trecho de código mostra como ler todas as pastas públicas e subpastas, listar e baixar quaisquer mensagens encontradas nessas pastas. Este exemplo funciona apenas com o Microsoft Exchange Server 2007 ou superior, pois apenas estes suportam 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 uma Mensagem para outra Pasta

A API Aspose.Email permite copiar uma mensagem de uma pasta para outra usando o método CopyItem. A versão sobrecarregada deste método retorna o URI Único da mensagem copiada, conforme mostrado neste artigo.

// 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 Itens de Pasta

A interface Aspose.Email para .NET IEWSClient proporciona a funcionalidade de sincronizar uma pasta Exchange para seu conteúdo. O método SyncFolder exposto pela classe IEWSClient pode ser usado para realizar a sincronização das informações da pasta em uma pasta especificada. O seguinte trecho de código mostra como sincronizar as informações da pasta do 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 Permissões para Pastas do Exchange

Os usuários são atribuídos permissões para pastas públicas no Exchange Server, o que limita/determina o nível de acesso que um usuário possui a essas pastas. A classe ExchangeFolderPermission fornece um conjunto de propriedades de permissão para pastas do Exchange, como o PermissionLevel, se eles podem CanCreateItems, DeleteItems e realizar outras tarefas conforme especificado pelas propriedades de permissão. As permissões podem ser recuperadas usando o método GetFolderPermissions() da classe IEWSClient. Este artigo mostra como recuperar as permissões aplicadas a uma pasta pública para todos os usuários que têm acesso às pastas compartilhadas.

Para realizar essa tarefa:

  1. Inicialize o EWSClient.
  2. Use o ListPublicFolders para obter uma lista de todas as pastas públicas.
  3. Recupere as permissões associadas a uma pasta usando o método GetFolderPermisssions().

O seguinte trecho de código mostra como usar a classe EWSClient para recuperar permissões aplicadas a uma pasta.

// 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
}

Criando Pastas e Subpastas

A API Aspose.Email fornece a capacidade de criar pastas em uma caixa de correio Exchange. O método CreateFolder da classe IEWSClient pode ser utilizado para esse propósito. Para criar uma pasta na caixa de correio do Exchange, os seguintes passos podem ser seguidos.

  1. Crie uma instância de IEWSClient.
  2. Defina a propriedade UseSlashAsFolderSeparator conforme necessário. Se definir como true, o aplicativo considerará a “barra” como separador de pasta e a subpasta será criada após a barra.
  3. Use o método CreateFolder para criar a pasta.

O seguinte trecho de código mostra como criar pastas e subpastas.

// 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);
}
}

Fazer Backup das Pastas do Exchange em PST

Frequentemente acontece que os usuários podem querer fazer um backup de todas ou algumas das pastas da caixa de correio. A Aspose.Email fornece a capacidade de fazer backup de todas ou das pastas de caixa de correio Exchange especificadas para um PST. Este artigo descreve como fazer o backup das pastas do Exchange para um PST com código de exemplo. Para fazer o backup das pastas do servidor Exchange, os seguintes passos podem ser seguidos.

  1. Inicie o IEWSClient com as credenciais do usuário.
  2. Adicione as informações das pastas necessárias à ExchangeFolderInfoCollection.
  3. Use o método Backup do cliente para exportar o conteúdo da pasta para PST.

O seguinte trecho de código mostra como fazer backup das pastas do Exchange para 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);