العمل مع المجلدات على خادم Exchange
قائمة جميع المجلدات من الخادم
توفر 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
الـ 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 للغة جافا 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);