Работа с папками на Exchange Server

Список всех папок с сервера

Aspose.Email API предоставляет возможность подключаться к Exchange Server и перечислять все папки и подпапки. Вы также можете рекурсивно получить все подпапки из каждой папки. Кроме того, предоставляется возможность перечисления папок с постраничной навигацией из клиента Exchange с использованием Exchange Web Service (EWS). В этой статье показано, как получить все подпапки с Exchange сервера и извлечь папки с постраничной навигацией.

Следующий фрагмент кода показывает, как перечислить папки с Exchange Server.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
void ListSubFolders(System::SharedPtr<Aspose::Email::Clients::Exchange::WebService::IEWSClient> client, System::SharedPtr<Aspose::Email::Clients::Exchange::ExchangeFolderInfo> folderInfo)
{
// Create the folder in disk (same name as on IMAP server)
System::Console::WriteLine(folderInfo->get_DisplayName());
try
{
// If this folder has sub-folders, call this method recursively to get messages
System::SharedPtr<ExchangeFolderInfoCollection> folderInfoCollection = client->ListSubFolders(folderInfo->get_Uri());
for (auto subfolderInfo : System::IterateOver(folderInfoCollection))
{
ListSubFolders(client, subfolderInfo);
}
}
catch (System::Exception& ) { }
}
void ListFoldersFromExchangeServer()
{
try
{
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
System::Console::WriteLine(u"Downloading all messages from Inbox....");
System::SharedPtr<ExchangeMailboxInfo> mailboxInfo = client->GetMailboxInfo();
System::Console::WriteLine(System::String(u"Mailbox URI: ") + mailboxInfo->get_MailboxUri());
System::String rootUri = client->GetMailboxInfo()->get_RootUri();
// List all the folders from Exchange server
System::SharedPtr<ExchangeFolderInfoCollection> folderInfoCollection = client->ListSubFolders(rootUri);
for (auto folderInfo : System::IterateOver(folderInfoCollection))
{
// Call the recursive method to read messages and get sub-folders
ListSubFolders(client, folderInfo);
}
System::Console::WriteLine(u"All messages downloaded.");
}
catch (System::Exception& ex)
{
System::Console::WriteLine(ex.get_Message());
}
}

Получение информации о типе папки с использованием EWS

Перечислитель ExchangeFolderType, предоставленный классом ExchangeFolderInfo, может быть использован для получения информации о типе папки. Это показано в приведенном ниже примере кода.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
const System::String mailboxUri = u"https://exchange/ews/exchange.asmx";
const System::String domain = u"";
const System::String username = u"username@ASE305.onmicrosoft.com";
const System::String password = u"password";
System::SharedPtr<System::Net::NetworkCredential> credentials = System::MakeObject<System::Net::NetworkCredential>(username, password, domain);
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
System::SharedPtr<ExchangeFolderInfoCollection> folderInfoCol = client->ListSubFolders(client->get_MailboxInfo()->get_RootUri());
for (auto folderInfo : System::IterateOver(folderInfoCol))
{
switch (folderInfo->get_FolderType())
{
case Aspose::Email::Clients::Exchange::ExchangeFolderType::Appointment:
break;
case Aspose::Email::Clients::Exchange::ExchangeFolderType::Contact:
break;
case Aspose::Email::Clients::Exchange::ExchangeFolderType::Task:
break;
case Aspose::Email::Clients::Exchange::ExchangeFolderType::Note:
break;
case Aspose::Email::Clients::Exchange::ExchangeFolderType::StickyNote:
break;
case Aspose::Email::Clients::Exchange::ExchangeFolderType::Journal:
break;
default:
break;
}
}

Перечисление папок с поддержкой постраничной навигации с использованием EWS

Следующий фрагмент кода показывает, как использовать поддержку постраничной навигации с EWS.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
try
{
// Create instance of ExchangeWebServiceClient class by giving credentials
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
// Call ListMessages method to list messages info from Inbox
System::SharedPtr<ExchangeMessageInfoCollection> msgCollection = client->ListMessages(client->GetMailboxInfo()->get_InboxUri());
int32_t itemsPerPage = 5;
System::SharedPtr<System::Collections::Generic::List<System::SharedPtr<PageInfo>>> pages = System::MakeObject<System::Collections::Generic::List<System::SharedPtr<PageInfo>>>();
System::SharedPtr<PageInfo> pagedMessageInfoCol = client->ListMessagesByPage(client->get_MailboxInfo()->get_InboxUri(), itemsPerPage);
pages->Add(pagedMessageInfoCol);
while (!pagedMessageInfoCol->get_LastPage())
{
pagedMessageInfoCol = client->ListMessagesByPage(client->get_MailboxInfo()->get_InboxUri(), itemsPerPage);
pages->Add(pagedMessageInfoCol);
}
pagedMessageInfoCol = client->ListMessagesByPage(client->get_MailboxInfo()->get_InboxUri(), itemsPerPage);
while (!pagedMessageInfoCol->get_LastPage())
{
client->ListMessages(client->get_MailboxInfo()->get_InboxUri());
}
}
catch (System::Exception& ex)
{
System::Console::Write(ex.get_Message());
}

Доступ к пользовательским папкам или подпапкам почтового ящика

IEWSClient позволяет разработчикам получать доступ к любой пользовательской папке или подпапке из почтового ящика. Метод FolderExists() класса IEWSClient возвращает URI заданной пользовательской папки/подпапки, который затем может быть использован для доступа к целевой папке. В следующем примере доступ к пользовательской папке с именем “TestInbox”, которая создана в INBOX, осуществляется и все сообщения из этой пользовательской папки отображаются. Для выполнения этой задачи выполняются следующие шаги:

  1. Инициализируйте объект IEWSClient, предоставив действительные учетные данные.
  2. Получите доступ к почтовому ящику по умолчанию.
  3. Получите доступ к родительской папке, которая является INBOX в данном примере. Эта родительская папка также может быть пользовательской папкой.
  4. Используйте метод FolderExists(), чтобы найти заданную пользовательскую подпапку, например, “TestInbox”. Он вернет URI “TestInbox”.
  5. Используйте этот URI, чтобы получить доступ ко всем сообщениям в этой пользовательской папке.

Следующий фрагмент кода показывает, как получить доступ к пользовательским папкам или подпапкам почтового ящика с EWS.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
// Create instance of EWSClient class by giving credentials
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
// Create ExchangeMailboxInfo, ExchangeMessageInfoCollection instance
System::SharedPtr<ExchangeMailboxInfo> mailbox = client->GetMailboxInfo();
System::SharedPtr<ExchangeMessageInfoCollection> messages;
System::SharedPtr<ExchangeFolderInfo> subfolderInfo = System::MakeObject<ExchangeFolderInfo>();
// Check if specified custom folder exisits and Get all the messages info from the target Uri
client->FolderExists(mailbox->get_InboxUri(), u"TestInbox", subfolderInfo);
//if custom folder exists
if (subfolderInfo != nullptr)
{
messages = client->ListMessages(subfolderInfo->get_Uri());
// Parse all the messages info collection
for (auto info : System::IterateOver(messages))
{
System::String strMessageURI = info->get_UniqueUri();
// now get the message details using FetchMessage()
System::SharedPtr<MailMessage> msg = client->FetchMessage(strMessageURI);
System::Console::WriteLine(System::String(u"Subject: ") + msg->get_Subject());
}
}
else
{
System::Console::WriteLine(u"No folder with this name found.");
}

Список публичных папок

Microsoft Exchange Server позволяет пользователям создавать публичные папки и отправлять сообщения в них. Для этого используйте класс EWSClient для подключения к Exchange Server и чтения и загрузки сообщений и публикаций из публичных папок. Следующий фрагмент кода показывает, как читать все публичные папки и подпапки, а также перечислять и загружать любые сообщения, найденные в этих папках. Этот пример работает только с Microsoft Exchange Server 2007 или выше, так как только они поддерживают EWS.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
static String dataDir = GetDataDir_Exchange();
String username;
String password;
String domain;
String mailboxUri;
void ListMessagesFromSubFolder(System::SharedPtr<Aspose::Email::Clients::Exchange::ExchangeFolderInfo> publicFolder, System::SharedPtr<Aspose::Email::Clients::Exchange::WebService::IEWSClient> client)
{
System::Console::WriteLine(System::String(u"Folder Name: ") + publicFolder->get_DisplayName());
System::SharedPtr<ExchangeMessageInfoCollection> msgInfoCollection = client->ListMessagesFromPublicFolder(publicFolder);
for (auto messageInfo : System::IterateOver(msgInfoCollection))
{
System::SharedPtr<MailMessage> msg = client->FetchMessage(messageInfo->get_UniqueUri());
System::Console::WriteLine(msg->get_Subject());
msg->Save(dataDir + msg->get_Subject() + u".msg", SaveOptions::get_DefaultMsgUnicode());
}
// Call this method recursively for any subfolders
if (publicFolder->get_ChildFolderCount() > 0)
{
System::SharedPtr<ExchangeFolderInfoCollection> subfolders = client->ListSubFolders(publicFolder);
for (System::SharedPtr<Aspose::Email::Clients::Exchange::ExchangeFolderInfo> subfolder : System::IterateOver(subfolders))
{
ListMessagesFromSubFolder(subfolder, client);
}
}
}
void ReadPublicFolders()
{
System::SharedPtr<System::Net::NetworkCredential> credential = System::MakeObject<System::Net::NetworkCredential>(username, password, domain);
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
System::SharedPtr<ExchangeFolderInfoCollection> folders = client->ListPublicFolders();
for (auto publicFolder : System::IterateOver(folders))
{
System::Console::WriteLine(System::String(u"Name: ") + publicFolder->get_DisplayName());
System::Console::WriteLine(System::String(u"Subfolders count: ") + publicFolder->get_ChildFolderCount());
ListMessagesFromSubFolder(publicFolder, client);
}
}
void DownloadMessagesFromPublicFolders()
{
try
{
ReadPublicFolders();
}
catch (System::Exception& ex)
{
System::Console::WriteLine(ex.get_Message());
}
}

Синхронизация элементов папки

Aspose.Email API IEWSClient предоставляет возможность синхронизации папки Exchange для ее содержимого. Метод SyncFolder, предоставляемый классом IEWSClient, может быть использован для синхронизации информации о папке в заданной папке. Следующий фрагмент кода показывает, как синхронизировать информацию о папке Exchange.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
System::SharedPtr<MailMessage> message1 = System::MakeObject<MailMessage>(u"user@domain.com", u"user@domain.com", System::String(u"EMAILNET-34738 - ") + System::ObjectExt::ToString(System::Guid::NewGuid()), u"EMAILNET-34738 Sync Folder Items");
client->Send(message1);
System::SharedPtr<MailMessage> message2 = System::MakeObject<MailMessage>(u"user@domain.com", u"user@domain.com", System::String(u"EMAILNET-34738 - ") + System::ObjectExt::ToString(System::Guid::NewGuid()), u"EMAILNET-34738 Sync Folder Items");
client->Send(message2);
System::SharedPtr<ExchangeMessageInfoCollection> messageInfoCol = client->ListMessages(client->get_MailboxInfo()->get_InboxUri());
System::SharedPtr<SyncFolderResult> result = client->SyncFolder(client->get_MailboxInfo()->get_InboxUri(), nullptr);
System::Console::WriteLine(result->get_NewItems()->get_Count());
System::Console::WriteLine(result->get_ChangedItems()->get_Count());
System::Console::WriteLine(result->get_ReadFlagChanged()->get_Count());
System::Console::WriteLine(result->get_DeletedItems()->get_Length());

Получение прав для папок Exchange

Пользователям назначаются права на публичные папки на Exchange Server, которые ограничивают/определяют уровень доступа пользователя к этим папкам. Класс ExchangeFolderPermission предоставляет набор свойств прав для папок Exchange, таких как уровень прав, возможность создания элементов, удаления элементов и выполнения других задач, определенных свойствами прав. Права можно получить с помощью метода GetFolderPermissions() класса IEWSClient. Эта статья показывает, как получить права, применяемые к публичной папке для всех пользователей, имеющих доступ к общим папкам.

Чтобы выполнить эту задачу:

  1. Инициализируйте IEWSClient.
  2. Используйте ListPublicFolders, чтобы получить список всех публичных папок.
  3. Извлеките права, связанные с папкой, с помощью метода GetFolderPermissions().

Следующий фрагмент кода показывает, как использовать класс IEWSClient для получения прав, применяемых к папке.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
System::String folderName = u"DesiredFolderName";
// Create instance of EWSClient class by giving credentials
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
try
{
System::SharedPtr<ExchangeFolderInfoCollection> folders = client->ListPublicFolders();
System::SharedPtr<ExchangeFolderPermissionCollection> permissions = System::MakeObject<ExchangeFolderPermissionCollection>();
System::SharedPtr<ExchangeFolderInfo> publicFolder;
for (auto folderInfo : System::IterateOver(folders))
{
if (System::ObjectExt::Equals(folderInfo->get_DisplayName(), folderName))
{
publicFolder = folderInfo;
}
}
if (publicFolder == nullptr)
{
System::Console::WriteLine(u"public folder was not created in the root public folder");
}
System::SharedPtr<ExchangePermissionCollection> folderPermissionCol = client->GetFolderPermissions(publicFolder->get_Uri());
for (auto perm : System::IterateOver(folderPermissionCol))
{
System::SharedPtr<ExchangeFolderPermission> permission = System::DynamicCast_noexcept<Aspose::Email::Clients::Exchange::ExchangeFolderPermission>(perm);
if (permission == nullptr)
{
System::Console::WriteLine(u"Permission is null.");
}
else
{
System::Console::WriteLine(u"User's primary smtp address: {0}", System::ObjectExt::Box<System::String>(permission->get_UserInfo()->get_PrimarySmtpAddress()));
System::Console::WriteLine(u"User can create Items: {0}", System::ObjectExt::Box<System::String>(System::Convert::ToString(permission->get_CanCreateItems())));
System::Console::WriteLine(u"User can delete Items: {0}", System::ObjectExt::Box<System::String>(System::ObjectExt::ToString(permission->get_DeleteItems())));
System::Console::WriteLine(u"Is Folder Visible: {0}", System::ObjectExt::Box<System::String>(System::Convert::ToString(permission->get_IsFolderVisible())));
System::Console::WriteLine(u"Is User owner of this folder: {0}", System::ObjectExt::Box<System::String>(System::Convert::ToString(permission->get_IsFolderOwner())));
System::Console::WriteLine(u"User can read items: {0}", System::ObjectExt::Box<System::String>(System::ObjectExt::ToString(permission->get_ReadItems())));
}
}
System::SharedPtr<ExchangeMailboxInfo> mailboxInfo = client->GetMailboxInfo();
//Get the Permissions for the Contacts and Calendar Folder
System::SharedPtr<ExchangePermissionCollection> contactsPermissionCol = client->GetFolderPermissions(mailboxInfo->get_ContactsUri());
System::SharedPtr<ExchangePermissionCollection> calendarPermissionCol = client->GetFolderPermissions(mailboxInfo->get_CalendarUri());
}
catch (System::Exception& ex)
{
System::Console::WriteLine(ex.get_Message());
}

Создание папок и подпапок

Aspose.Email API предоставляет возможность создавать папки в почтовом ящике Exchange. Метод CreateFolder класса IEWSClient может быть использован для этой цели. Для создания папки в почтовом ящике Exchange можно использовать следующие шаги.

  1. Создайте экземпляр IEWSClient.
  2. Установите свойство set_UseSlashAsFolderSeparator по мере необходимости. Если установлено в true, приложение будет рассматривать “Слэш” как разделитель папок, и подпапка будет создана после слэша.
  3. Используйте метод CreateFolder для создания папки.

Следующий фрагмент кода показывает, как создать папки и подпапки.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
// Create instance of EWSClient class by giving credentials
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
System::String inbox = client->get_MailboxInfo()->get_InboxUri();
System::String folderName1 = u"EMAILNET-35054";
System::String subFolderName0 = u"2015";
System::String folderName2 = folderName1 + u"/" + subFolderName0;
System::String folderName3 = folderName1 + u" / 2015";
System::SharedPtr<ExchangeFolderInfo> rootFolderInfo;
System::SharedPtr<ExchangeFolderInfo> folderInfo;
client->set_UseSlashAsFolderSeparator(true);
client->CreateFolder(client->get_MailboxInfo()->get_InboxUri(), folderName1);
client->CreateFolder(client->get_MailboxInfo()->get_InboxUri(), folderName2);
if (client->FolderExists(inbox, folderName1, rootFolderInfo))
{
if (client->FolderExists(inbox, folderName2, folderInfo))
{
client->DeleteFolder(folderInfo->get_Uri(), true);
}
client->DeleteFolder(rootFolderInfo->get_Uri(), true);
}

Резервное копирование папок Exchange в PST

Часто бывает так, что пользователи хотят сделать резервную копию всех или некоторых папок почтового ящика. Aspose.Email предоставляет возможность создать резервную копию всех или заданных папок почтового ящика Exchange в PST. Чтобы создать резервную копию папок Exchange, можно следовать следующим шагам.

  1. Создайте экземпляр IEWSClient.
  2. Добавьте информацию о необходимых папках в ExchangeFolderInfoCollection.
  3. Используйте метод IEWSClient->Backup, чтобы экспортировать содержимое папки в PST.

Следующий фрагмент кода показывает, как создать резервную копию папок Exchange в PST.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-C
System::String dataDir = GetDataDir_Exchange();
// Create instance of IEWSClient class by providing credentials
System::SharedPtr<IEWSClient> client = GetExchangeEWSClient(GetExchangeTestUser());
// Get Exchange mailbox info of other email account
System::SharedPtr<ExchangeMailboxInfo> mailboxInfo = client->GetMailboxInfo();
System::SharedPtr<ExchangeFolderInfo> info = client->GetFolderInfo(mailboxInfo->get_InboxUri());
System::SharedPtr<ExchangeFolderInfoCollection> fc = System::MakeObject<ExchangeFolderInfoCollection>();
fc->Add(info);
try
{
client->Backup(fc, dataDir + u"Backup_out.pst", Aspose::Email::Storage::Pst::BackupOptions::None);
}
catch (System::Exception& ex)
{
System::Console::WriteLine(ex.get_Message());
}