עבודה עם תיקיות ב‑Exchange Server
רישום כל התיקיות מהשרת
API של Aspose.Email מספקת את היכולת להתחבר ל‑Exchange Server ולרשום את כל התיקיות ותתי‑תיקיות. ניתן גם לקבל את כל תתי‑התיקיות מכל תיקייה באופן רקורסיבי. היא גם מאפשרת רישום תיקיות עם עימוד (paging) מהלקוח של 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
קטעת הקוד הבא מראה לך כיצד להשתמש בתמיכה בעמודים (paging) באמצעות 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);
}
}
}
העתקת הודעה לתיקייה אחרת
API של Aspose.Email מאפשר להעתיק הודעה מתיקייה אחת לתיקייה אחרת באמצעות ה‑ 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());
}
סנכרון פריטי תיקייה
API של Aspose.Email ל‑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 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
}
יצירת תיקיות ותת‑תיקיות
ממשק ה‑API של Aspose.Email מספק אפשרות ליצור תיקיות בתיבת דואר של 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);