Работа с папками на 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, осуществляется и все сообщения из этой пользовательской папки отображаются. Для выполнения этой задачи выполняются следующие шаги:
- Инициализируйте объект IEWSClient, предоставив действительные учетные данные.
- Получите доступ к почтовому ящику по умолчанию.
- Получите доступ к родительской папке, которая является INBOX в данном примере. Эта родительская папка также может быть пользовательской папкой.
- Используйте метод FolderExists(), чтобы найти заданную пользовательскую подпапку, например, “TestInbox”. Он вернет URI “TestInbox”.
- Используйте этот 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. Эта статья показывает, как получить права, применяемые к публичной папке для всех пользователей, имеющих доступ к общим папкам.
Чтобы выполнить эту задачу:
- Инициализируйте IEWSClient.
- Используйте ListPublicFolders, чтобы получить список всех публичных папок.
- Извлеките права, связанные с папкой, с помощью метода 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 можно использовать следующие шаги.
- Создайте экземпляр IEWSClient.
- Установите свойство set_UseSlashAsFolderSeparator по мере необходимости. Если установлено в true, приложение будет рассматривать “Слэш” как разделитель папок, и подпапка будет создана после слэша.
- Используйте метод 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, можно следовать следующим шагам.
- Создайте экземпляр IEWSClient.
- Добавьте информацию о необходимых папках в ExchangeFolderInfoCollection.
- Используйте метод 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()); | |
} |