Робота з папками на Exchange Server
Перелік усіх папок із сервера
Aspose.Email API забезпечує можливість підключення до Exchange Server та перелічення усіх папок і підпапок. Ви також можете рекурсивно отримати всі підпапки кожної папки. Також передбачена можливість перебору папок з посторінковим відображенням із клієнта Exchange за допомогою Exchange Web Service (EWS). У цій статті показано, як отримати всі підпапки з сервера Exchange та отримати папки з пагінацією.
Наступний фрагмент коду показує, як вивести список папок з сервера Exchange.
// For complete examples and data files, please go to 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("Downloading all messages from Inbox....");
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
System.out.println("Mailbox URI: " + mailboxInfo.getMailboxUri());
String rootUri = client.getMailboxInfo().getRootUri();
// List all the folders from Exchange server
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(rootUri);
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
// Call the recursive method to read messages and get sub-folders
listSubFolders(client, folderInfo);
}
System.out.println("All messages downloaded.");
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
}
private static void listSubFolders(IEWSClient client, ExchangeFolderInfo folderInfo) {
// Create the folder in disk (same name as on IMAP server)
System.out.println(folderInfo.getDisplayName());
try {
// If this folder has sub-folders, call this method recursively to get messages
ExchangeFolderInfoCollection folderInfoCollection = client.listSubFolders(folderInfo.getUri());
for (ExchangeFolderInfo subfolderInfo : (Iterable<ExchangeFolderInfo>) folderInfoCollection) {
listSubFolders(client, subfolderInfo);
}
} catch (java.lang.RuntimeException e) {
}
}
Отримання інформації про тип папки за допомогою EWS
The 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:
// 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.
// 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().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", створеної під INBOX, і відображаються всі повідомлення з цієї папки. Щоб виконати це завдання, виконайте наступні кроки:
- Ініціалізуйте об’єкт IEWSClient, надавши дійсні облікові дані.
- Отримайте доступ до поштової скриньки за замовчуванням.
- Отримайте доступ до батьківської папки, яка в цьому прикладі є INBOX. Ця батьківська папка також може бути користувацькою папкою.
- Використайте folderExists(), щоб шукати вказану користувацьку підпапку, наприклад "TestInbox". Він поверне URI "TestInbox".
- Використайте цей URI, щоб отримати доступ до всіх повідомлень у цій користувацькій папці.
Наступний фрагмент коду показує, як отримати доступ до користувацьких папок або підпапок поштової скриньки за допомогою EWS.
// 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
ExchangeFolderInfo[] referenceToSubfolderInfo = { subfolderInfo };
client.folderExists(mailbox.getInboxUri(), "TestInbox", /* out */ referenceToSubfolderInfo);
subfolderInfo = referenceToSubfolderInfo[0];
// if custom folder exists
if (subfolderInfo != null) {
messages = client.listMessages(subfolderInfo.getUri());
// Parse all the messages info collection
for (ExchangeMessageInfo info : (Iterable<ExchangeMessageInfo>) messages) {
String strMessageURI = info.getUniqueUri();
// now get the message details using FetchMessage()
MailMessage msg = client.fetchMessage(strMessageURI);
System.out.println("Subject: " + msg.getSubject());
}
} else {
System.out.println("No folder with this name found.");
}
Перелік публічних папок
Microsoft Exchange Server дозволяє користувачам створювати публічні папки та розміщувати в них повідомлення. Щоб зробити це через ваш додаток, використовуйте Aspose.Email EWSClient клас для підключення до 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("Name: " + publicFolder.getDisplayName());
System.out.println("Subfolders count: " + publicFolder.getChildFolderCount());
listMessagesFromSubFolder(publicFolder, client);
}
}
private static void listMessagesFromSubFolder(ExchangeFolderInfo publicFolder, IEWSClient client) {
System.out.println("Folder Name: " + 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());
}
// Call this method recursively for any subfolders
if (publicFolder.getChildFolderCount() > 0) {
ExchangeFolderInfoCollection subfolders = client.listSubFolders(publicFolder);
for (ExchangeFolderInfo subfolder : (Iterable<ExchangeFolderInfo>) subfolders) {
listMessagesFromSubFolder(subfolder, client);
}
}
}
Копіювання повідомлення в іншу папку
Aspose.Email API дозволяє копіювати повідомлення з однієї папки в іншу, використовуючи copyItem метод. Перевантажена версія цього методу повертає унікальний URI скопійованого повідомлення, як показано в цій статті.
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 - " + UUID.randomUUID().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.getMailboxInfo().getDeletedItemsUri());
} catch (java.lang.RuntimeException ex) {
System.out.println(ex.getMessage());
}
Синхронізація елементів папки
Aspose.Email для Java API 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 Sync Folder Items");
client.send(message1);
MailMessage message2 = new MailMessage("user@domain.com", "user@domain.com", "EMAILNET-34738 - " + UUID.randomUUID().toString(), "EMAILNET-34738 Sync Folder Items");
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";
// 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 {
for (ExchangeFolderInfo folderInfo : (Iterable<ExchangeFolderInfo>) folders)
if (folderInfo.getDisplayName().equals(folderName))
publicFolder = folderInfo;
if (publicFolder == null)
System.out.println("public folder was not created in the root public folder");
ExchangePermissionCollection folderPermissionCol = client.getFolderPermissions(publicFolder.getUri());
for (ExchangeBasePermission perm : (Iterable<ExchangeBasePermission>) folderPermissionCol) {
if (perm instanceof ExchangeFolderPermission)
System.out.println("Permission is null.");
else {
ExchangeFolderPermission permission = (ExchangeFolderPermission) perm;
System.out.println("User's primary smtp address: " + permission.getUserInfo().getPrimarySmtpAddress());
System.out.println("User can create Items: " + permission.canCreateItems());
System.out.println("User can delete Items: " + permission.getDeleteItems());
System.out.println("Is Folder Visible: " + permission.isFolderVisible());
System.out.println("Is User owner of this folder: " + permission.isFolderOwner());
System.out.println("User can read items: " + permission.getReadItems());
}
}
ExchangeMailboxInfo mailboxInfo = client.getMailboxInfo();
// Get the Permissions for the Contacts and Calendar Folder
ExchangePermissionCollection contactsPermissionCol = client.getFolderPermissions(mailboxInfo.getContactsUri());
ExchangePermissionCollection calendarPermissionCol = client.getFolderPermissions(mailboxInfo.getCalendarUri());
} finally {
// Do the needfull
}
Створення папок і підпапок
Aspose.Email API надає можливість створювати папки в поштовій скриньці Exchange. CreateFolder метод IEWSClient можна використовувати для цього. Щоб створити папку в поштовій скриньці сервера Exchange, можна виконати такі кроки.
- Створіть екземпляр IEWSClient.
- Встановіть властивість UseSlashAsFolderSeparator за потребою. Якщо встановити в true, застосунок буде вважати «слеш» роздільником папок, і підпапка буде створена після слеша.
- Використайте метод createFolder для створення папки.
Нижченаведений фрагмент коду показує, як створити папки та підпапки.
// 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.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/";
// Create instance of IEWSClient class by providing credentials
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);
// Get Exchange mailbox info of other email account
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);