การทำงานกับโฟลเดอร์บน 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-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
นี้ 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’s 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 for 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 แอปพลิเคชันจะพิจารณา "Slash" เป็นตัวคั่นโฟลเดอร์และโฟลเดอร์ย่อยจะถูกสร้างหลังสแลช
- ใช้เมธอด 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);