Работа с папками на 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, и отображаются все сообщения из этой пользовательской папки. Для выполнения этой задачи выполните следующие шаги:

  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-.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. Эта статья показывает, как получить разрешения, примененные к публичной папке для всех пользователей, которые имеют доступ к общим папкам.

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

  1. Инициализируйте EWSClient.
  2. Используйте ListPublicFolders, чтобы получить список всех публичных папок
  3. Извлеките разрешения, связанные с папкой, с помощью метода 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 можно использовать следующие шаги.

  1. Создайте экземпляр IEWSClient.
  2. Установите свойство UseSlashAsFolderSeparator по мере необходимости. Если установлено в true, приложение будет рассматривать “Slash” как разделитель папок, и подпапка будет создана после косой черты.
  3. Используйте метод 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 сервера, можно следовать следующим шагам.

  1. Инициализируйте IEWSClient с учетными данными пользователя
  2. Добавьте информацию о требуемой папке в ExchangeFolderInfoCollection
  3. Используйте метод 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);