Làm việc với Thư mục trên Exchange Server
Liệt kê tất cả các thư mục từ máy chủ
API Aspose.Email cung cấp khả năng kết nối tới Exchange Server và liệt kê tất cả các thư mục và thư mục con. Bạn cũng có thể lấy tất cả các thư mục con từ mỗi thư mục một cách đệ quy. Nó cũng cung cấp khả năng liệt kê thư mục với phân trang từ client Exchange sử dụng Exchange Web Service (EWS). Bài viết này cho thấy cách lấy tất cả các thư mục con từ máy chủ Exchange và lấy thư mục với phân trang.
Đoạn mã sau đây cho bạn thấy cách liệt kê các thư mục từ Exchange Server.
// 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) {
}
}
Lấy Thông Tin Loại Thư Mục bằng EWS
Cái FolderType thuộc tính được cung cấp bởi ExchangeFolderInfo lớp có thể được sử dụng để lấy thông tin về loại của thư mục. Như được trình bày trong mẫu mã dưới đây.
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;
}
}
Liệt Kê Thư Mục với Hỗ Trợ Phân Trang bằng EWS
Đoạn mã sau cho bạn thấy cách sử dụng hỗ trợ phân trang bằng 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());
}
Truy Cập Các Thư Mục Tùy Chỉnh hoặc Thư Mục Con của Hộp Thư
IEWSClient cho phép các nhà phát triển truy cập bất kỳ thư mục tùy chỉnh hoặc thư mục con nào từ hộp thư. The folderExists() chức năng của IEWSClient trả về URI của một thư mục/tư mục con tùy chỉnh được chỉ định, có thể được sử dụng để truy cập thư mục mục tiêu. Trong ví dụ sau, một thư mục tùy chỉnh có tên "TestInbox", được tạo dưới INBOX, được truy cập và tất cả các tin nhắn được hiển thị từ thư mục tùy chỉnh này. Để thực hiện nhiệm vụ này, các bước sau đây sẽ được thực hiện:
- Khởi tạo đối tượng IEWSClient bằng cách cung cấp thông tin đăng nhập hợp lệ.
- Truy cập hộp thư mặc định.
- Truy cập thư mục cha, trong ví dụ này là INBOX. Thư mục cha này cũng có thể là một thư mục tùy chỉnh.
- Sử dụng folderExists() để tìm kiếm thư mục con tùy chỉnh được chỉ định, ví dụ "TestInbox". Nó sẽ trả về URI của "TestInbox".
- Sử dụng Uri này để truy cập tất cả các tin nhắn trong thư mục tùy chỉnh đó.
Đoạn mã sau cho bạn thấy cách truy cập các thư mục tùy chỉnh hoặc thư mục con của hộp thư với 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.");
}
Liệt Kê Các Thư Mục Công Cộng
Microsoft Exchange Server cho phép người dùng tạo các thư mục công cộng và đăng tin nhắn vào chúng. Để thực hiện điều này qua ứng dụng của bạn, sử dụng Aspose.Email’s EWSClient lớp để kết nối tới Exchange Server và đọc, tải xuống các tin nhắn và bài đăng từ các thư mục công cộng. Đoạn mã sau cho bạn thấy cách đọc tất cả các thư mục công cộng, các thư mục con, và liệt kê và tải xuống bất kỳ tin nhắn nào được tìm thấy trong các thư mục này. Ví dụ này chỉ hoạt động với Microsoft Exchange Server 2007 trở lên vì chỉ các phiên bản này hỗ trợ 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);
}
}
}
Sao Chép Tin Nhắn tới Thư Mục Khác
API Aspose.Email cho phép sao chép một tin nhắn từ thư mục này sang thư mục khác bằng cách sử dụng copyItem phương thức. Phiên bản overload của phương thức này trả về URI duy nhất của tin nhắn đã sao chép như được mô tả trong bài viết này.
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());
}
Đồng Bộ Các Mục Thư Mục
API Aspose.Email cho Java IEWSClient cung cấp tính năng đồng bộ một thư mục Exchange cho nội dung của nó. The syncFolder phương thức được cung cấp bởi IEWSClient lớp có thể được sử dụng để thực hiện đồng bộ thông tin thư mục trên một thư mục được chỉ định. Đoạn mã sau cho bạn thấy cách đồng bộ thông tin thư mục 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);
Lấy Quyền cho Các Thư Mục Exchange
Người dùng được gán quyền cho các thư mục công cộng trên Exchange Server, điều này giới hạn/định rõ mức độ truy cập của người dùng vào những thư mục này. The ExchangeFolderPermission lớp cung cấp một tập hợp các thuộc tính quyền cho các thư mục Exchange như PermissionLevel, liệu họ có thể canCreateItems, deleteItems, và thực hiện các tác vụ khác theo các thuộc tính quyền. Các quyền có thể được lấy bằng cách sử dụng getFolderPermissions() phương thức của IEWSClient. Bài viết này cho thấy cách lấy các quyền đã áp dụng cho một thư mục công cộng cho tất cả người dùng có quyền truy cập vào các thư mục được chia sẻ.
Để thực hiện nhiệm vụ này:
- Khởi tạo EWSClient.
- Sử dụng listPublicFolders để lấy danh sách tất cả các thư mục công cộng
- Lấy các quyền liên quan đến một thư mục bằng cách sử dụng phương thức getFolderPermissions()
Đoạn mã sau cho bạn thấy cách sử dụng EWSClient lớp để lấy quyền đã áp dụng cho một thư mục.
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
}
Tạo Thư Mục và Thư Mục Con
API Aspose.Email cung cấp khả năng tạo thư mục trong hộp thư Exchange. CreateFolder phương thức của IEWSClient có thể được sử dụng cho mục đích này. Để tạo một thư mục trong hộp thư Exchange server, có thể thực hiện các bước sau.
- Tạo một thể hiện của IEWSClient.
- Thiết lập thuộc tính UseSlashAsFolderSeparator theo yêu cầu. Nếu đặt thành true, ứng dụng sẽ xem "Slash" là dấu phân tách thư mục và thư mục con sẽ được tạo sau dấu gạch chéo.
- Sử dụng phương thức createFolder để tạo thư mục.
Đoạn mã sau đây cho bạn thấy cách tạo các thư mục và thư mục con.
// 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);
}
}
Sao lưu Thư mục Exchange sang PST
Thường thì người dùng có thể muốn sao lưu tất cả hoặc một phần các thư mục hộp thư. Aspose.Email cung cấp khả năng sao lưu tất cả hoặc các thư mục hộp thư Exchange đã chỉ định sang PST. Bài viết này mô tả việc sao lưu các thư mục Exchange sang PST với mã mẫu. Để sao lưu các thư mục trên máy chủ Exchange, có thể thực hiện các bước sau.
- Khởi tạo IEWSClient với thông tin xác thực người dùng
- Thêm thông tin thư mục cần thiết vào ExchangeFolderInfoCollection
- Sử dụng phương pháp sao lưu của client để xuất nội dung thư mục sang PST
Đoạn mã sau đây cho bạn thấy cách sao lưu các thư mục exchange sang 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);