Работа с папками на 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-.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) | |
{ | |
} | |
} |
Получение информации о типе папки с использованием EWS
Свойство FolderType класса ExchangeFolderInfo может быть использовано для получения информации о типе папки. Это показано в приведенном ниже примере кода.
// 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; | |
} |
Перечисление папок с поддержкой постраничной навигации с использованием EWS
Следующий фрагмент кода показывает, как использовать поддержку постраничной навигации с использованием 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 | |
{ | |
} |
Доступ к пользовательским папкам или подпапкам почтового ящика
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-.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."); | |
} |
Список открытых папок
Microsoft Exchange Server позволяет пользователям создавать публичные папки и размещать сообщения в них. Для этого через ваше приложение используйте класс Aspose.Email 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-.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); | |
} | |
} | |
} |
Копирование сообщения в другую папку
Aspose.Email API позволяет копировать сообщение из одной папки в другую с использованием метода CopyItem. Перегруженная версия этого метода возвращает уникальный URI скопированного сообщения, как показано в этой статье.
// 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); | |
} |
Синхронизация элементов папки
Aspose.Email for .NET API интерфейс IEWSClient предоставляет возможность синхронизации папки Exchange с ее содержимым. Метод SyncFolder класса IEWSClient может быть использован для выполнения синхронизации информации по указанной папке. Следующий фрагмент кода показывает, как синхронизировать информацию о папке 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); |
Получение разрешений для папок Exchange
Пользователям назначаются разрешения для публичных папок на Exchange Server, которые ограничивают/определяют уровень доступа пользователя к этим папкам. Класс ExchangeFolderPermission предоставляет набор свойств разрешений для папок Exchange, таких как PermissionLevel, могут ли они CanCreateItems, DeleteItems, и выполнять другие задачи, как указано в свойствах разрешения. Разрешения могут быть получены с помощью метода GetFolderPermissions() класса IEWSClient. Эта статья показывает, как получить разрешения, примененные к публичной папке для всех пользователей, которые имеют доступ к общим папкам.
Чтобы выполнить эту задачу:
- Инициализируйте EWSClient.
- Используйте ListPublicFolders, чтобы получить список всех публичных папок
- Извлеките разрешения, связанные с папкой, с помощью метода GetFolderPermisssions()
Следующий фрагмент кода показывает, как использовать класс EWSClient для получения разрешений, примененных к папке.
// 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 | |
} |
Создание папок и подпапок
Aspose.Email API предоставляет возможность создавать папки в почтовом ящике Exchange. Метод CreateFolder класса IEWSClient можно использовать для этой цели. Для создания папки в почтовом ящике Exchange можно использовать следующие шаги.
- Создайте экземпляр IEWSClient.
- Установите свойство UseSlashAsFolderSeparator по мере необходимости. Если установлено в true, приложение будет рассматривать “Slash” как разделитель папок, и подпапка будет создана после косой черты.
- Используйте метод CreateFolder, чтобы создать папку.
Следующий фрагмент кода показывает, как создавать папки и подпапки.
// 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); | |
} | |
} |
Резервное копирование папок Exchange в PST
Часто бывает так, что пользователи могут захотеть сделать резервную копию всех или некоторых папок почтового ящика. Aspose.Email предоставляет возможность резервного копирования всех или определенных папок почтового ящика Exchange в PST. Эта статья описывает резервное копирование папок Exchange в PST с примером кода. Чтобы сделать резервную копию папок Exchange сервера, можно следовать следующим шагам.
- Инициализируйте IEWSClient с учетными данными пользователя
- Добавьте информацию о требуемой папке в ExchangeFolderInfoCollection
- Используйте метод Backup клиента для экспорта содержимого папки в PST
Следующий фрагмент кода показывает, как резервировать папки exchange в 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); |