Работа с папками на Exchange Server
Список всех папок на сервере
API Aspose.Email предоставляет возможность подключаться к Exchange Server и перечислять все папки и подпапки. Вы также можете рекурсивно извлечь все подпапки из каждой папки. Он также предоставляет возможность перечисления папок с постраничной навигацией из клиента Exchange с использованием Exchange Web Service (EWS). Эта статья показывает, как получить все подпапки с сервера Exchange и извлечь папки с постраничной навигацией.
Следующий фрагмент кода показывает, как перечислить папки с сервера Exchange.
// Для полноценных примеров и файлов данных, пожалуйста, перейдите по адресу https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
try {
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
System.out.println("Загрузка всех сообщений из Входящих....");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
System.out.println("URI почтового ящика: " + mailboxInfo.getMailboxUri());
String rootUri = client.getMailboxInfo().getRootUri();
// Перечислить все папки с сервера Exchange
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(rootUri);
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
// Вызвать рекурсивный метод для чтения сообщений и получения подпапок
listSubFolders(client, folderInfo);
}
System.out.println("Все сообщения загружены.");
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
private static void listSubFolders(IEWSClient client, ExchangeFolderInfo folderInfo) {
// Создать папку на диске (такое же имя, как на IMAP-сервере)
System.out.println(folderInfo.getDisplayName());
try {
// Если эта папка имеет подпапки, вызвать этот метод рекурсивно для получения сообщений
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(folderInfo.getUri());
for (ExchangeFolderInfo subfolderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
listSubFolders(client, subfolderInfo);
}
} catch (java.lang.RuntimeException e) {
}
}
Получение информации о типе папки с использованием EWS
Свойство FolderType, предоставляемое классом ExchangeFolderInfo, может быть использовано для получения информации о типе папки. Это показано в следующем примере кода.
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credentials);
ExchangeFolderInfoCollection folderInfoCol = client.listSubFolders(client.getMailboxInfo().getRootUri());
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCol) {
switch (folderInfo.getFolderType()) {
case ExchangeFolderType.Appointment:
// обрабатывать назначение
break;
case ExchangeFolderType.Contact:
// обрабатывать контакт
break;
case ExchangeFolderType.Task:
// обрабатывать задачу
break;
case ExchangeFolderType.Note:
// обрабатывать сообщение электронной почты
break;
case ExchangeFolderType.StickyNote:
// обрабатывать заметку
break;
case ExchangeFolderType.Journal:
// обрабатывать журнал
break;
default:
break;
}
}
Перечисление папок с поддержкой постраничной навигации с использованием EWS
Следующий фрагмент кода показывает, как использовать поддержку постраничной навигации с использованием EWS.
// Создать экземпляр класса ExchangeWebServiceClient, предоставив учетные данные
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "UserName", "Password");
// Вызвать метод ListMessages для перечисления информации о сообщениях из Входящих
ExchangeMessageInfoCollection msgCollection = client.listMessages(client.getMailboxInfo().getInboxUri());
int itemsPerPage = 5;
List<PageInfo> pages = new ArrayList<PageInfo>();
PageInfo pagedMessageInfoCol = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
pages.add(pagedMessageInfoCol);
while (!pagedMessageInfoCol.getLastPage()) {
pagedMessageInfoCol = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
pages.add(pagedMessageInfoCol);
}
pagedMessageInfoCol = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), itemsPerPage);
while (!pagedMessageInfoCol.getLastPage()) {
client.listMessages(client.getMailboxInfo().getInboxUri());
}
Доступ к пользовательским папкам или подпапкам почтового ящика
IEWSClient позволяет разработчикам получать доступ к любой пользовательской папке или подпапке из почтового ящика. Функция folderExists() класса IEWSClient возвращает URI указанной пользовательской папки/подпапки, который затем можно использовать для доступа к целевой папке. В следующем примере пользовательская папка с именем “TestInbox”, созданная в папке ВХОДЯЩИЕ, доступна, и все сообщения отображаются из этой пользовательской папки. Чтобы выполнить эту задачу, выполните следующие шаги:
- Инициализируйте объект IEWSClient, предоставив действительные учетные данные.
- Получите доступ к стандартному почтовому ящику.
- Получите доступ к родительской папке, которая в этом примере является ВХОДЯЩИЕ. Эта родительская папка также может быть пользовательской папкой.
- Используйте folderExists(), чтобы найти указанную пользовательскую подпапку, например “TestInbox”. Это вернет URI “TestInbox”.
- Используйте этот URI для доступа ко всем сообщениям в этой пользовательской папке.
Следующий фрагмент кода показывает, как получить доступ к пользовательским папкам или подпапкам почтового ящика с помощью EWS.
// Создать экземпляр класса EWSClient, предоставив учетные данные
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
// Создать экземпляры ExchangeMailboxInfo и ExchangeMessageInfoCollection
ExchangeMailboxInfo mailbox = client.getMailboxInfo();
ExchangeMessageInfoCollection messages = null;
ExchangeFolderInfo subfolderInfo = new ExchangeFolderInfo();
// Проверить, существует ли указанная пользовательская папка, и получить всю информацию о сообщениях из целевого URI
ExchangeFolderInfo[] referenceToSubfolderInfo = { subfolderInfo };
client.folderExists(mailbox.getInboxUri(), "TestInbox", /* out */ referenceToSubfolderInfo);
subfolderInfo = referenceToSubfolderInfo[0];
// если пользовательская папка существует
if (subfolderInfo != null) {
messages = client.listMessages(subfolderInfo.getUri());
// Обработать всю коллекцию информации о сообщениях
for (ExchangeMessageInfo info : (Iterable<ExchangeMessageInfo>) messages) {
String strMessageURI = info.getUniqueUri();
// теперь получить детали сообщения, используя FetchMessage()
MailMessage msg = client.fetchMessage(strMessageURI);
System.out.println("Тема: " + msg.getSubject());
}
} else {
System.out.println("Папка с таким именем не найдена.");
}
Список общих папок
Microsoft Exchange Server позволяет пользователям создавать общие папки и размещать сообщения в них. Чтобы сделать это через ваше приложение, используйте класс EWSClient от Aspose.Email, чтобы подключиться к Exchange Server и читать и загружать сообщения и публикации из общих папок. Следующий фрагмент кода показывает, как прочитать все общие папки и подпапки, а также перечислить и загрузить любые сообщения, найденные в этих папках. Этот пример работает только с Microsoft Exchange Server 2007 или выше, так как только они поддерживают EWS.
public static void run() {
try {
readPublicFolders();
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
private static void readPublicFolders() {
NetworkCredential credential = new NetworkCredential(username, password, domain);
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);
ExchangeFolderInfoCollection folders = client.listPublicFolders();
for (ExchangeFolderInfo publicFolder : (Iterable<ExchangeFolderInfo>) folders) {
System.out.println("Имя: " + publicFolder.getDisplayName());
System.out.println("Количество подпапок: " + publicFolder.getChildFolderCount());
listMessagesFromSubFolder(publicFolder, client);
}
}
private static void listMessagesFromSubFolder(ExchangeFolderInfo publicFolder, IEWSClient client) {
System.out.println("Имя папки: " + publicFolder.getDisplayName());
ExchangeMessageInfoCollection msgInfoCollection = client.listMessagesFromPublicFolder(publicFolder);
for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) msgInfoCollection) {
MailMessage msg = client.fetchMessage(messageInfo.getUniqueUri());
System.out.println(msg.getSubject());
msg.save(dataDir + msg.getSubject() + ".msg", SaveOptions.getDefaultMsgUnicode());
}
// Вызвать этот метод рекурсивно для любых подпапок
if (publicFolder.getChildFolderCount() > 0) {
ExchangeFolderInfoCollection subfolders = client.listSubFolders(publicFolder);
for (ExchangeFolderInfo subfolder : (Iterable<ExchangeFolderInfo>) subfolders) {
listMessagesFromSubFolder(subfolder, client);
}
}
}
Копирование сообщения в другую папку
API Aspose.Email позволяет копировать сообщение из одной папки в другую с помощью метода copyItem. Перегруженная версия этого метода возвращает уникальный URI скопированного сообщения, как показано в этой статье.
try {
// Создать экземпляр класса EWSClient, предоставив учетные данные
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 - " + UUID.randomUUID().toString(),
"EMAILNET-34997 Exchange: Копировать сообщение и получить ссылку на новый элемент копии");
String messageUri = client.appendMessage(message);
String newMessageUri = client.copyItem(messageUri, client.getMailboxInfo().getDeletedItemsUri());
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
Синхронизация элементов папки
API Aspose.Email for Java IEWSClient предоставляет возможность синхронизации папки Exchange для ее содержания. Метод syncFolder, предоставляемый классом IEWSClient, может использоваться для выполнения синхронизации информации о папке в указанной папке. Следующий фрагмент кода показывает, как синхронизировать информацию о папке Exchange.
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 - " + UUID.randomUUID().toString(), "EMAILNET-34738 Синхронизация элементов папки");
client.send(message1);
MailMessage message2 = new MailMessage("user@domain.com", "user@domain.com", "EMAILNET-34738 - " + UUID.randomUUID().toString(), "EMAILNET-34738 Синхронизация элементов папки");
client.send(message2);
ExchangeMessageInfoCollection messageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
SyncFolderResult result = client.syncFolder(client.getMailboxInfo().getInboxUri(), null);
System.out.println(result.getNewItems().size());
System.out.println(result.getChangedItems().size());
System.out.println(result.getReadFlagChanged().size());
System.out.println(result.getDeletedItems().length);
Получение разрешений для папок Exchange
Пользователям назначаются разрешения на общие папки на Exchange Server, что ограничивает/определяет уровень доступа, который у них есть к этим папкам. Класс ExchangeFolderPermission предоставляет набор свойств разрешений для папок Exchange, таких как PermissionLevel, возможность canCreateItems, deleteItems, и выполнение других задач, как указано в свойствах разрешений. Разрешения могут быть извлечены с помощью метода getFolderPermissions() класса IEWSClient. Эта статья показывает, как получить разрешения, примененные к общей папке для всех пользователей, имеющих доступ к общим папкам.
Для выполнения этой задачи:
- Инициализируйте EWSClient.
- Используйте listPublicFolders для получения списка всех общих папок.
- Извлеките разрешения, связанные с папкой, с помощью метода getFolderPermissions().
Следующий фрагмент кода показывает, как использовать класс EWSClient для извлечения разрешений, примененных к папке.
String folderName = "DesiredFolderName";
// Создать экземпляр класса EWSClient, предоставив учетные данные
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 {
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folders)
if (folderInfo.getDisplayName().equals(folderName))
publicFolder = folderInfo;
if (publicFolder == null)
System.out.println("общая папка не была создана в корневой общей папке");
ExchangePermissionCollection folderPermissionCol = client.getFolderPermissions(publicFolder.getUri());
for (ExchangeBasePermission perm : (Iterable<ExchangeBasePermission>) folderPermissionCol) {
if (perm instanceof ExchangeFolderPermission)
System.out.println("Разрешение равно null.");
else {
ExchangeFolderPermission permission = (ExchangeFolderPermission) perm;
System.out.println("Основной smtp-адрес пользователя: " + permission.getUserInfo().getPrimarySmtpAddress());
System.out.println("Пользователь может создавать элементы: " + permission.canCreateItems());
System.out.println("Пользователь может удалять элементы: " + permission.getDeleteItems());
System.out.println("Является ли папка видимой: " + permission.isFolderVisible());
System.out.println("Является ли пользователь владельцем этой папки: " + permission.isFolderOwner());
System.out.println("Пользователь может читать элементы: " + permission.getReadItems());
}
}
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
// Получить разрешения для папок Контактов и Календаря
ExchangePermissionCollection contactsPermissionCol = client.getFolderPermissions(mailboxInfo.getContactsUri());
ExchangePermissionCollection calendarPermissionCol = client.getFolderPermissions(mailboxInfo.getCalendarUri());
} finally {
// Выполнить необходимые действия
}
Создание папок и подпапок
API Aspose.Email предоставляет возможность создавать папки в почтовом ящике Exchange. Метод CreateFolder класса IEWSClient может быть использован для этой цели. Чтобы создать папку в почтовом ящике сервера Exchange, можно выполнить следующие шаги.
- Создайте экземпляр IEWSClient.
- Установите свойство UseSlashAsFolderSeparator по мере необходимости. Если установить в true, приложение будет считать “Слеш” разделителем папок, и подпапка будет создана после слеша.
- Используйте метод createFolder для создания папки.
Следующий фрагмент кода показывает, как создать папки и подпапки.
// Создать экземпляр класса EWSClient, предоставив учетные данные
IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
String inbox = client.getMailboxInfo().getInboxUri();
String folderName1 = "EMAILNET-35054";
String subFolderName0 = "2015";
String folderName2 = folderName1 + "/" + subFolderName0;
String folderName3 = folderName1 + " / 2015";
ExchangeFolderInfo rootFolderInfo = null;
ExchangeFolderInfo folderInfo = null;
try {
client.setUseSlashAsFolderSeparator(true);
client.createFolder(client.getMailboxInfo().getInboxUri(), folderName1);
client.createFolder(client.getMailboxInfo().getInboxUri(), folderName2);
} finally {
ExchangeFolderInfo[] referenceToRootFolderInfo = { rootFolderInfo };
boolean outRefCondition0 = client.folderExists(inbox, folderName1, /* out */ referenceToRootFolderInfo);
rootFolderInfo = referenceToRootFolderInfo[0];
if (outRefCondition0) {
ExchangeFolderInfo[] referenceToFolderInfo = { folderInfo };
boolean outRefCondition1 = client.folderExists(inbox, folderName2, /* out */ referenceToFolderInfo);
folderInfo = referenceToFolderInfo[0];
if (outRefCondition1)
client.deleteFolder(folderInfo.getUri(), true);
client.deleteFolder(rootFolderInfo.getUri(), true);
}
}
Резервное копирование папок Exchange в PST
Часто пользователи могут захотеть сделать резервную копию всех или некоторых папок почтового ящика. Aspose.Email предоставляет возможность создать резервную копию всех или определенных папок почтового ящика Exchange в PST. Эта статья описывает, как сделать резервную копию папок Exchange в PST с примером кода. Чтобы сделать резервную копию папок сервера Exchange, можно выполнить следующие шаги.
- Инициализируйте IEWSClient с учетными данными пользователя.
- Добавьте необходимую информацию о папке в ExchangeFolderInfoCollection.
- Используйте метод резервного копирования клиента для экспорта содержимого папки в PST.
Следующий фрагмент кода показывает, как сделать резервное копирование папок Exchange в PST.
String dataDir = "data/";
// Создать экземпляр класса IEWSClient, предоставив учетные данные
final String mailboxUri = "https://ews.domain.com/ews/Exchange.asmx";
final String domain = "";
final String username = "username";
final String password = "password";
NetworkCredential credential = new NetworkCredential(username, password, domain);
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);
// Получить информацию о почтовом ящике Exchange другого почтового аккаунта
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
ExchangeFolderInfo info = client.getFolderInfo(mailboxInfo.getInboxUri());
ExchangeFolderInfoCollection fc = new ExchangeFolderInfoCollection();
fc.addItem(info);
client.backup(fc, dataDir + "Backup_out.pst", BackupOptions.None);