العمل مع الرسائل في ملف PST
إضافة رسائل إلى ملفات PST
إنشاء ملف PST جديد وإضافة مجلدات فرعية أظهرنا كيفية إنشاء ملف PST وإضافة مجلد فرعي إليه. باستخدام Aspose.Email يمكنك إضافة رسائل إلى المجلدات الفرعية لملف PST الذي أنشأته أو حمّلته. يضيف هذا المقال رسالتين من القرص إلى المجلد الفرعي Inbox في ملف PST. استخدم الـ PersonalStorage و FolderInfo فئات لإضافة رسائل إلى ملفات PST. لإضافة رسائل إلى مجلد Inbox في ملف PST:
- أنشئ نسخة من الفئة FolderInfo وحمّلها بمحتويات مجلد Inbox.
- إضافة رسائل من القرص إلى مجلد Inbox عن طريق استدعاء الـ FolderInfo.addMessage() طريقة. الـ FolderInfo الفئة تكشف عن الـ addMessages طريقة تمكّن من إضافة عدد كبير من الرسائل إلى المجلد، مما يقلل عمليات الإدخال/الإخراج إلى القرص ويحسن الأداء. مثال كامل يمكن العثور عليه أدناه، في إضافة رسائل دفعة.
الشفرة البرمجية أدناه تُظهر كيفية إضافة رسائل إلى مجلد فرعي داخل ملف PST يُدعى Inbox.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Create new PST
PersonalStorage personalStorage = PersonalStorage.create(dataDir, FileFormatVersion.Unicode);
// Add new folder "Inbox"
personalStorage.getRootFolder().addSubFolder("Inbox");
// Select the "Inbox" folder
FolderInfo inboxFolder = personalStorage.getRootFolder().getSubFolder("Inbox");
// Add some messages to "Inbox" folder
inboxFolder.addMessage(MapiMessage.fromFile(dataDir + "MapiMsgWithPoll.msg"));
إضافة رسائل دفعة
إضافة رسائل فردية إلى ملف PST يعني المزيد من عمليات الإدخال/الإخراج إلى القرص وبالتالي قد يؤدي إلى إبطاء الأداء. للحصول على أداء محسّن، يمكن إضافة الرسائل إلى ملف PST بطريقة الدفعات لتقليل عمليات الإدخال/الإخراج. الـ addMessages(Iterable
تحميل الرسائل من القرص
القطعة البرمجية التالية توضح لك كيفية تحميل الرسائل من القرص.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
private static void addMessagesInBulkMode(String fileName, String msgFolderName) {
try (PersonalStorage personalStorage = PersonalStorage.fromFile(fileName)) {
FolderInfo folder = personalStorage.getRootFolder().getSubFolder("myInbox");
folder.MessageAdded.add(new MessageAddedEventHandler() {
public void invoke(Object sender, MessageAddedEventArgs e) {
onMessageAdded(sender, e);
}
});
folder.addMessages(new MapiMessageCollection(msgFolderName));
}
}
static void onMessageAdded(Object sender, MessageAddedEventArgs e) {
System.out.println(e.getEntryId());
System.out.println(e.getMessage().getSubject());
}
تنفيذ Iterable
القطعة البرمجية التالية توضح لك كيفية إنشاء تنفيذ Iterable.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public class MapiMessageCollection implements Iterable<MapiMessage> {
private final File folder;
public MapiMessageCollection(String folder) {
this.folder = new File(folder);
}
public Iterator<MapiMessage> iterator() {
return new MapiMessageIterator(folder.listFiles());
}
}
public class MapiMessageIterator implements Iterator<MapiMessage> {
private Queue<String> queue = new LinkedList<String>();
public MapiMessageIterator(File[] listOfFiles) {
for (File file : listOfFiles) {
queue.offer(file.getAbsolutePath());
}
}
public boolean hasNext() {
return !queue.isEmpty();
}
public MapiMessage next() {
return MapiMessage.fromFile(queue.poll());
}
}
إضافة رسائل من PST آخر
لإضافة رسائل من PST آخر، استخدم الـ FolderInfo.enumerateMapiMessages() طريقة تُعيد Iterable
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
private static void bulkAddFromAnotherPst(String source) {
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage pst = PersonalStorage.fromFile(source, false)) {
try (PersonalStorage pstDest = PersonalStorage.fromFile(dataDir + "PersonalStorageFile1.pst")) {
// Get the folder by name
FolderInfo folderInfo = pst.getRootFolder().getSubFolder("Contacts");
MessageInfoCollection ms = folderInfo.getContents();
// Get the folder by name
FolderInfo f = pstDest.getRootFolder().getSubFolder("myInbox");
f.MessageAdded.add(new MessageAddedEventHandler() {
public void invoke(Object sender, MessageAddedEventArgs e) {
onMessageAdded(sender, e);
}
});
f.addMessages(folderInfo.enumerateMapiMessages());
FolderInfo fi = pstDest.getRootFolder().getSubFolder("myInbox");
MessageInfoCollection msgs = fi.getContents();
}
}
}
// Handles the MessageAdded event.
static void onMessageAdded(Object sender, MessageAddedEventArgs e) {
System.out.println(e.getEntryId());
System.out.println(e.getMessage().getSubject());
}
الحصول على معلومات الرسائل من ملف Outlook PST
في قراءة ملف Outlook PST والحصول على معلومات المجلدات والمجلدات الفرعية، ناقشنا تحميل ملف Outlook PST وتصفح مجلداته للحصول على أسماء المجلدات وعدد الرسائل فيها. توضح هذه المقالة كيفية قراءة جميع المجلدات والمجلدات الفرعية في ملف PST وعرض معلومات الرسائل، مثل الموضوع، المرسل، والمستقبلين. الـ FolderInfo.getContents() طريقة تُستخدم لعرض معلومات مختصرة عن الرسالة مثل الموضوع، المرسل، المستقبلين. من حيث الأداء، هذا هو الخيار الأنسب للحصول على المعلومات الأساسية حول الرسائل. لـ استخراج بيانات الرسالة الكاملة، الـ PersonalStorage.extractMessage() تم توفير طريقة. قد يحتوي ملف Outlook PST على مجلدات متداخلة. للحصول على معلومات الرسائل منها، وكذلك من المجلدات العليا، استخدم طريقة عودية لقراءة جميع المجلدات. يوضح المقتطف البرمجي التالي كيفية قراءة ملف Outlook PST وعرض محتويات المجلد والرسائل بشكل عودي.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
// The path to the File directory.
String dataDir = "data/";
// Load the Outlook file
String path = dataDir + "PersonalStorage.pst";
try {
// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.fromFile(path);
// Get the Display Format of the PST file
System.out.println("Display Format: " + personalStorage.getFormat());
// Get the folders and messages information
FolderInfo folderInfo = personalStorage.getRootFolder();
// Call the recursive method to display the folder contents
displayFolderContents(folderInfo, personalStorage);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
// This is a recursive method to display contents of a folder
private static void displayFolderContents(FolderInfo folderInfo, PersonalStorage pst) {
// Display the folder name
System.out.println("Folder: " + folderInfo.getDisplayName());
System.out.println("==================================");
// Display information about messages inside this folder
MessageInfoCollection messageInfoCollection = folderInfo.getContents();
for (MessageInfo messageInfo : messageInfoCollection) {
System.out.println("Subject: " + messageInfo.getSubject());
System.out.println("Sender: " + messageInfo.getSenderRepresentativeName());
System.out.println("Recipients: " + messageInfo.getDisplayTo());
System.out.println("------------------------------");
}
// Call this method recursively for each subfolder
if (folderInfo.hasSubFolders() == true) {
for (FolderInfo subfolderInfo : folderInfo.getSubFolders()) {
displayFolderContents(subfolderInfo, pst);
}
}
}
استخراج الرسائل من ملفات PST
توضح هذه المقالة كيفية قراءة ملفات Microsoft Outlook PST و استخراج الرسائل. ثم تُحفظ الرسائل إلى القرص بصيغة MSG. تُظهر المقالة أيضًا كيفية استخراج عدد محدد من الرسائل من ملف PST. استخدم طريقة عودية لتصفح جميع المجلدات (بما فيها المجلدات المتداخلة) واستدعِ الـ PersonalStorage.extractMessage() طريقة للحصول على رسائل Outlook في نسخة من الـ MapiMessage فئة. بعد ذلك، استدعِ الـ MapiMessage.save() طريقة لحفظ الرسالة إما على القرص أو إلى تدفق بصيغة MSG. يوضح المقتطف البرمجي التالي كيفية استخراج الرسائل من ملف PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
// The path to the File directory.
String dataDir = "data/";
// Load the Outlook file
String path = dataDir + "PersonalStorage.pst";
try {
// load the Outlook PST file
PersonalStorage pst = PersonalStorage.fromFile(path);
// get the Display Format of the PST file
System.out.println("Display Format: " + pst.getFormat());
// get the folders and messages information
FolderInfo folderInfo = pst.getRootFolder();
// Call the recursive method to extract msg files from each folder
extractMsgFiles(folderInfo, pst);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
// This is a recursive method to display contents of a folder
private static void extractMsgFiles(FolderInfo folderInfo, PersonalStorage pst) {
// display the folder name
System.out.println("Folder: " + folderInfo.getDisplayName());
System.out.println("==================================");
// loop through all the messages in this folder
MessageInfoCollection messageInfoCollection = folderInfo.getContents();
for (MessageInfo messageInfo : messageInfoCollection) {
System.out.println("Saving message {0} ...." + messageInfo.getSubject());
// get the message in MapiMessage instance
MapiMessage message = pst.extractMessage(messageInfo);
// save this message to disk in msg format
message.save(message.getSubject().replace(":", " ") + ".msg");
// save this message to stream in msg format
ByteArrayOutputStream messageStream = new ByteArrayOutputStream();
message.save(messageStream);
}
// Call this method recursively for each subfolder
if (folderInfo.hasSubFolders() == true) {
for (FolderInfo subfolderInfo : folderInfo.getSubFolders()) {
extractMsgFiles(subfolderInfo, pst);
}
}
}
حفظ الرسائل مباشرة من PST إلى تدفق
لحفظ الرسائل من ملف PST مباشرة إلى تدفق، دون استخراج MsgInfo للرسائل، استخدم الـ saveMessageToStream() طريقة. يوضح المقتطف البرمجي التالي كيفية حفظ الرسائل مباشرة من PST إلى تدفق.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
// Load the Outlook file
String path = dataDir + "PersonalStorage.pst";
// Save message to MemoryStream
try (PersonalStorage personalStorage = PersonalStorage.fromFile(path)) {
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");
for (MessageInfo messageInfo : inbox.enumerateMessages()) {
try (ByteArrayOutputStream memeorystream = new ByteArrayOutputStream()) {
personalStorage.saveMessageToStream(messageInfo.getEntryIdString(), memeorystream);
}
}
}
// Save message to file
try (PersonalStorage pst = PersonalStorage.fromFile(path)) {
FolderInfo inbox = pst.getRootFolder().getSubFolder("Inbox");
for (MessageInfo messageInfo : inbox.enumerateMessages()) {
try (FileOutputStream fs = new FileOutputStream(new File(dataDir + messageInfo.getSubject() + ".msg"))) {
pst.saveMessageToStream(messageInfo.getEntryIdString(), fs);
}
}
}
try (PersonalStorage pst = PersonalStorage.fromFile(path)) {
FolderInfo inbox = pst.getRootFolder().getSubFolder("Inbox");
// To enumerate entryId of messages you may use FolderInfo.EnumerateMessagesEntryId() method:
for (String entryId : inbox.enumerateMessagesEntryId()) {
try (ByteArrayOutputStream ms = new ByteArrayOutputStream()) {
pst.saveMessageToStream(entryId, ms);
}
}
}
استخراج عدد n من الرسائل من ملف PST
يعرض المقتطف البرمجي التالي كيفية استخراج عدد معين من الرسائل من PST. ما عليك سوى توفير الفهرس للرسالة الأولى، وإجمالي عدد الرسائل التي سيتم استخراجها.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");
// Extracts messages starting from 10th index top and extract total 100 messages
MessageInfoCollection messages = inbox.getContents(10, 100);
الحصول على إجمالي عدد العناصر من ملف PST
توفر Aspose.Email الـ GetTotalItemsCount() طريقة الـ PersonalStorage.Store خاصية. تُعيد العدد الإجمالي لعناصر الرسائل الموجودة في PST.
يوضح المثال البرمجي التالي كيفية استرجاع العدد الكلي للعناصر (رسائل، مواعيد، جهات اتصال، إلخ) المخزنة داخل ملف PST:
try (PersonalStorage pst = PersonalStorage.fromFile("my.pst", false)) {
int count = pst.getStore().getTotalItemsCount();
}
حذف العناصر من ملفات PST
Add Messages to PST Files أظهر كيفية إضافة رسائل إلى ملفات PST. ومن الممكن بالطبع أيضًا حذف العناصر (المحتويات) من ملف PST وقد يكون من المرغوب حذف الرسائل دفعة واحدة. يمكن حذف العناصر من ملف PST باستخدام الـ FolderInfo.deleteChildItem() طريقة. توفر الواجهة البرمجية أيضًا FolderInfo.deleteChildItems() طريقة لحذف العناصر دفعة واحدة من ملف PST.
حذف الرسائل من ملفات PST
توضح هذه المقالة كيفية استخدام الـ FolderInfo فئة للوصول إلى مجلدات محددة في ملف PST. لحذف الرسائل من المجلد الفرعي للمرسلة في ملف PST تم تحميله مسبقًا أو إنشاؤه:
- إنشاء مثيل من الـ FolderInfo الفئة وتحميلها بمحتويات المجلد الفرعي للمرسلة.
- احذف الرسائل من مجلد المرسلة عن طريق استدعاء FolderInfo.deleteChildItem() طريقة وتمرير الـ MessageInfo.EntryId كمعامل. يوضح المقتطف البرمجي التالي كيفية حذف الرسائل من مجلد فرعي للرسائل المرسلة في ملف PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";
// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir);
// Get the Sent items folder
FolderInfo folderInfo = personalStorage.getPredefinedFolder(StandardIpmFolder.SentItems);
MessageInfoCollection msgInfoColl = folderInfo.getContents();
for (MessageInfo msgInfo : msgInfoColl) {
System.out.println(msgInfo.getSubject() + ": " + msgInfo.getEntryIdString());
if (msgInfo.getSubject().equals("some delete condition")) {
// Delete this item
folderInfo.deleteChildItem(msgInfo.getEntryId());
System.out.println("Deleted this message");
}
}
حذف المجلدات من ملفات PST
يمكنك حذف مجلد PST بنقله إلى مجلد العناصر المحذوفة.
try (PersonalStorage pst = PersonalStorage.fromFile("test.pst")) {
FolderInfo deletedItemsFolder = pst.getPredefinedFolder(StandardIpmFolder.DeletedItems);
FolderInfo emptyFolder = pst.getRootFolder().getSubFolder("Empty folder");
FolderInfo someFolder = pst.getRootFolder().getSubFolder("Some folder");
pst.moveItem(emptyFolder, deletedItemsFolder);
pst.moveItem(someFolder, deletedItemsFolder);
}
ميزة هذه الطريقة هي أن المجلد المحذوف يمكن استعادته بسهولة.
FolderInfo someFolder = deletedItemsFolder.getSubFolder("Some folder");
pst.moveItem(someFolder, pst.getRootFolder());
يمكنك أيضًا إزالة مجلد بشكل دائم من مجلد العناصر المحذوفة إذا لزم الأمر.
deletedItemsFolder.deleteChildItem(emptyFolder.getEntryId());
الـ deleteChildItem() يمكن استخدام الطريقة لأي مجلدات إذا كنت تريد حذف المجلد الفرعي فورًا وبشكل دائم، متجاوزًا مجلد العناصر المحذوفة.
FolderInfo someFolder = pst.getRootFolder().getSubFolder("Some folder");
pst.getRootFolder().deleteChildItem(someFolder.getEntryId());
حذف العناصر دفعة واحدة من ملف PST
يمكن استخدام Aspose.Email API لحذف العناصر دفعة واحدة من ملف PST. يتم ذلك باستخدام الـ deleteChildItems() طريقة تقبل قائمة من عناصر معرف الإدخال (Entry ID) التي تشير إلى العناصر التي سيتم حذفها. يوضح المقتطف البرمجي التالي كيفية حذف العناصر دفعة واحدة من ملف PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";
try (PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir)) {
// Get Inbox SubFolder from Outlook file
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");
// Create instance of PersonalStorageQueryBuilder
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.getFrom().contains("someuser@domain.com");
MessageInfoCollection messages = inbox.getContents(queryBuilder.getQuery());
List<String> deleteList = new ArrayList<String>();
for (MessageInfo messageInfo : messages) {
deleteList.add(messageInfo.getEntryIdString());
}
// delete messages having From = "someuser@domain.com"
inbox.deleteChildItems(deleteList);
}
تعداد واسترداد الرسائل المحذوفة ناعماً من PST
يمكن استرجاع الرسائل المحذوفة نهائيًا باستخدام Aspose.Email for Java. تتيح واجهته برمجة التطبيقات تعداد الرسائل المحذوفة ناعماً في ملفات PST. العناصر المحذوفة ناعماً هي رسائل تم حذفها مرتين - أولاً تم نقلها إلى مجلد العناصر المحذوفة ثم إزالتها من هناك. لا تزال هذه الرسائل قابلة للاسترداد، ويوفر Aspose.Email طريقة مريحة للوصول إليها. الـ PersonalStorage.findAndEnumerateSoftDeletedItems() طريقة تُعيد مجموعة من RestoredItemEntry كائنات. كل إدخال يحتوي على:
- MapiMessage عنصر — الرسالة المستعادة.
- String FolderId - معرّف المجلد الذي كانت الرسالة تنتمي إليه أصلاً.
يوضح المثال البرمجي التالي كيفية تعداد العناصر البريدية المحذوفة ناعماً (القابلة للاسترداد) في ملفات PST:
// Load the PST file
try (PersonalStorage pst = PersonalStorage.fromFile(fileName)) {
// Enumerate soft-deleted items
for (RestoredItemEntry entry : pst.findAndEnumerateSoftDeletedItems()) {
MapiMessage message = entry.getItem();
String folderId = entry.getFolderId();
System.out.println("Subject: " + message.getSubject());
System.out.println("Deleted from Folder ID: " + folderId);
System.out.println("-----------------------------------");
}
}
بحث عن الرسائل والمجلدات في PST وفقًا لمعيار
يمكن لملفات التخزين الشخصي (PST) أن تحتوي على كميات هائلة من البيانات، ويتطلب البحث عن بيانات تفي بمعايير محددة في مثل هذه الملفات الكبيرة تضمين نقاط فحص متعددة في الكود لتصفية المعلومات. باستخدام الـ PersonalStorageQueryBuilder فئة، يتيح Aspose.Email إمكانية البحث عن سجلات محددة في PST بناءً على معيار بحث محدد. يمكن البحث في PST عن الرسائل وفقًا لمعلمات البحث مثل المرسل، المستقبل، الموضوع، أهمية الرسالة، وجود مرفقات، حجم الرسالة، وحتى معرف الرسالة. الـ PersonalStorageQueryBuilder يمكن أيضًا استخدامها للبحث عن المجلدات الفرعية.
البحث عن الرسائل والمجلدات في PST
يوضح مقتطف الكود التالي كيفية استخدام PersonalStorageQueryBuilder فئة للبحث عن المحتويات في PST بناءً على معايير بحث مختلفة. على سبيل المثال، تُظهر البحث في PST بناءً على:
- أهمية الرسالة.
- فئة الرسالة.
- وجود مرفقات.
- حجم الرسالة.
- تاريخ الرسالة.
- رسائل غير مقروءة.
- رسائل غير مقروءة مع مرفقات، و
- المجلدات ذات اسم المجلد الفرعي المحدد.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir + "Outlook.pst")) {
FolderInfo folder = personalStorage.getRootFolder().getSubFolder("Inbox");
PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();
// High importance messages
builder.getImportance().equals((int) MapiImportance.High);
MessageInfoCollection messages = folder.getContents(builder.getQuery());
System.out.println("Messages with High Imp:" + messages.size());
builder = new PersonalStorageQueryBuilder();
builder.getMessageClass().equals("IPM.Note");
messages = folder.getContents(builder.getQuery());
System.out.println("Messages with IPM.Note:" + messages.size());
builder = new PersonalStorageQueryBuilder();
// Messages with attachments AND high importance
builder.getImportance().equals((int) MapiImportance.High);
builder.hasFlags(MapiMessageFlags.MSGFLAG_HASATTACH);
messages = folder.getContents(builder.getQuery());
System.out.println("Messages with atts: " + messages.size());
builder = new PersonalStorageQueryBuilder();
// Messages with size > 15 KB
builder.getMessageSize().greater(15000);
messages = folder.getContents(builder.getQuery());
System.out.println("messags size > 15Kb:" + messages.size());
java.util.Calendar c = java.util.Calendar.getInstance();
builder = new PersonalStorageQueryBuilder();
// Messages by Current Date
// (Note that queries by date are not supported for Calendar Items in the Appointments folder)
builder.getSentDate().on(c.getTime(), DateComparisonType.ByDate);
messages = folder.getContents(builder.getQuery());
System.out.println("Messages by Current Date: " + messages.size());
builder = new PersonalStorageQueryBuilder();
// Messages between Dates
// (Note that queries by date are not supported for Calendar Items in the Appointments folder)
c.set(2020, 0, 1, 0, 0, 0);
builder.getSentDate().since(c.getTime());
c.set(2021, 0, 1, 0, 0, 0);
builder.getSentDate().before(c.getTime());
messages = folder.getContents(builder.getQuery());
System.out.println("Messages between Dates: " + messages.size());
builder = new PersonalStorageQueryBuilder();
// Unread messages
builder.hasNoFlags(MapiMessageFlags.MSGFLAG_READ);
messages = folder.getContents(builder.getQuery());
System.out.println("Unread:" + messages.size());
builder = new PersonalStorageQueryBuilder();
// Unread messages with attachments
builder.hasNoFlags(MapiMessageFlags.MSGFLAG_READ);
builder.hasFlags(MapiMessageFlags.MSGFLAG_HASATTACH);
messages = folder.getContents(builder.getQuery());
System.out.println("Unread msgs with atts: " + messages.size());
// Folder with name of 'SubInbox'
builder = new PersonalStorageQueryBuilder();
builder.getFolderName().equals("SubInbox");
FolderInfoCollection folders = folder.getSubFolders(builder.getQuery());
System.out.println("Folder having subfolder: " + folders.size());
builder = new PersonalStorageQueryBuilder();
// Folders with subfolders
builder.hasSubfolders();
folders = folder.getSubFolders(builder.getQuery());
System.out.println(folders.size());
}
البحث عن سلسلة نصية في PST مع معامل تجاهل الحالة
يعرض المقتطف البرمجي التالي كيفية البحث عن سلسلة نصية في PST باستخدام معامل تجاهل الحالة.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage personalStorage = PersonalStorage.create(dataDir + "CaseSensitivity.pst", FileFormatVersion.Unicode)) {
FolderInfo folderinfo = personalStorage.createPredefinedFolder("Inbox", StandardIpmFolder.Inbox);
folderinfo.addMessage(MapiMessage.fromMailMessage(MailMessage.load("Sample.eml")));
PersonalStorageQueryBuilder builder = new PersonalStorageQueryBuilder();
// IgnoreCase is True
builder.getFrom().contains("automated", true);
MailQuery query = builder.getQuery();
MessageInfoCollection coll = folderinfo.getContents(query);
System.out.println(coll.size());
}
البحث عن موضوعات الرسائل باستخدام كلمات مفتاحية متعددة في ملف PST
يمكنك استخدام MailQueryBuilder.or طريقة للعثور على رسائل ذات موضوع يحتوي على كلمة واحدة على الأقل من الكلمات المحددة كما هو موضح أدناه:
PersonalStorageQueryBuilder builder1 = new PersonalStorageQueryBuilder();
builder1.getSubject().contains("Review"); // 'Review' is key word for the search
PersonalStorageQueryBuilder builder2 = new PersonalStorageQueryBuilder();
builder2.getSubject().contains("Error"); // 'Error' is also key word for the search
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.or(builder1.getQuery(), builder2.getQuery()); // message subjects must contain 'Review' or 'Error' words
try (PersonalStorage storage = PersonalStorage.fromFile("example.pst"))
{
FolderInfo folderInfo = storage.getRootFolder().getSubFolder("Inbox");
MessageInfoCollection messageInfos = folderInfo.getContents(queryBuilder.getQuery());
for (MessageInfo messageInfo : messageInfos)
{
System.out.println(messageInfo.getSubject());
}
}
استرجاع مجزأ لمحتويات مجلد PST
حسّن أداء تطبيقك والتحكم عند تصفح المجلدات الكبيرة. استرجع محتويات المجلد بطريقة مجزأة باستخدام توسيع Aspose.Email لـ getContents طريقة. هذه الطريقة - FolderInfo.getContents(MailQuery query, int startIndex, int count) - يسترجع مجموعة فرعية من الرسائل التي تطابق الاستعلام المحدد، بدءًا من فهرس معين ومحدودة بعدد. يوضح المثال البرمجي التالي استرجاعًا مجزأً ومعالجة للرسائل المصفاة من مجلد PST:
// Load the PST file
try (PersonalStorage pst = PersonalStorage.fromFile(fileName)) {
// Access a specific subfolder
FolderInfo folder = pst.getRootFolder().getSubFolder("Inbox");
// Build a query to filter messages by sender address
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.getFrom().contains("report-service", true);
// Define the page size
int pageSize = 5;
// Retrieve and process messages in pages
for (int pageIndex = 0; pageIndex < 6; pageIndex++) {
int startIndex = pageIndex * pageSize;
// Get a page of messages
MessageInfoCollection messages = folder.getContents(queryBuilder.getQuery(), startIndex, pageSize);
for (MessageInfo messageInfo : messages) {
// Output basic info about each message
System.out.println("Subject: " + messageInfo.getSubject() + ", Sender: " + messageInfo.getSenderRepresentativeName());
}
}
}
نقل العناصر إلى مجلدات أخرى في ملف PST
يتيح Aspose.Email إمكانية نقل العناصر من مجلد المصدر إلى مجلد آخر في نفس ملف التخزين الشخصي (PST). وهذا يشمل:
- نقل مجلد محدد إلى مجلد أب جديد.
- نقل رسالة محددة إلى مجلد جديد.
- نقل المحتويات إلى مجلد جديد.
- نقل المجلدات الفرعية إلى مجلد أب جديد.
يعرض المقتطف البرمجي التالي كيفية نقل العناصر مثل الرسائل والمجلدات من مجلد مصدر إلى مجلد آخر في نفس ملف PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
try (PersonalStorage personalStorage = PersonalStorage.fromFile("test.pst")) {
FolderInfo inbox = personalStorage.getPredefinedFolder(StandardIpmFolder.Inbox);
FolderInfo deleted = personalStorage.getPredefinedFolder(StandardIpmFolder.DeletedItems);
FolderInfo subfolder = inbox.getSubFolder("Subfolder");
// Move folder and message to the Deleted Items
personalStorage.moveItem(subfolder, deleted);
MessageInfoCollection contents = subfolder.getContents();
personalStorage.moveItem(contents.get(0), deleted);
// Move all inbox subfolders and subfolder contents to the Deleted Items
inbox.moveSubfolders(deleted);
subfolder.moveContents(deleted);
}
تحديث خصائص الرسالة في ملف PST
في بعض الأحيان يلزم تحديث بعض خصائص الرسائل مثل تغيير الموضوع، وضع علامة على أهمية الرسالة وما إلى ذلك. يمكن تحقيق تحديث رسالة في ملف PST مع هذه التغييرات في خصائص الرسالة باستخدام FolderInfo.changeMessages طريقة. توضح هذه المقالة كيفية تحديث الرسائل دفعة واحدة في ملف PST لتغييرات الخصائص. يوضح مثال الكود التالي كيفية تحديث خصائص الرسائل في وضع الدفعة لعدة رسائل في ملف PST.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";
// Load the Outlook PST file
PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir);
// Get Requierd Subfolder
FolderInfo inbox = personalStorage.getRootFolder().getSubFolder("Inbox");
// find messages having From = "someuser@domain.com"
PersonalStorageQueryBuilder queryBuilder = new PersonalStorageQueryBuilder();
queryBuilder.getFrom().contains("someuser@domain.com");
// Get Contents from Query
MessageInfoCollection messages = inbox.getContents(queryBuilder.getQuery());
// Save (MessageInfo,EntryIdString) in List
List<String> changeList = new ArrayList<String>();
for (MessageInfo messageInfo : messages) {
changeList.add(messageInfo.getEntryIdString());
}
// Compose the new properties
MapiPropertyCollection updatedProperties = new MapiPropertyCollection();
updatedProperties.add(MapiPropertyTag.PR_SUBJECT_W, new MapiProperty(MapiPropertyTag.PR_SUBJECT_W, "New Subject".getBytes(Charset.forName("utf-16le"))));
updatedProperties.add(MapiPropertyTag.PR_IMPORTANCE, new MapiProperty(MapiPropertyTag.PR_IMPORTANCE, BitConverter.getBytesInt64(2)));
// update messages having From = "someuser@domain.com" with new properties
inbox.changeMessages(changeList, updatedProperties);
تحديث الخصائص المخصصة في ملف PST
أحيانًا يتطلب الأمر وضع علامة على العناصر التي تمت معالجتها داخل ملف PST. تتيح واجهة برمجة تطبيقات Aspose.Email تحقيق ذلك باستخدام MapiProperty و MapiNamedProperty. الطرق التالية مفيدة لتحقيق ذلك.
- constructor MapiNamedProperty(long propertyTag, String nameIdentifier, UUID propertyGuid, byte[] propertyValue)
- constructor MapiNamedProperty(long propertyTag, long nameIdentifier, UUID propertyGuid, byte[] propertyValue)
- FolderInfo.changeMessages(MapiPropertyCollection updatedProperties) - changes all messages in folder
- PersonalStorage.changeMessage(String entryId, MapiPropertyCollection updatedProperties) - change message properties
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
public static void run() {
// The path to the File directory.
String dataDir = "data/" + "Sub.pst";
try (PersonalStorage personalStorage = PersonalStorage.fromFile(dataDir)) {
FolderInfo testFolder = personalStorage.getRootFolder().getSubFolder("Inbox");
// Create the collection of message properties for adding or updating
MapiPropertyCollection newProperties = new MapiPropertyCollection();
// Normal, Custom and PidLidLogFlags named property
MapiProperty property = new MapiProperty(MapiPropertyTag.PR_ORG_EMAIL_ADDR_W, "test_address@org.com".getBytes(Charset.forName("utf-16le")));
MapiProperty namedProperty1 = new MapiNamedProperty(generateNamedPropertyTag(0L, MapiPropertyType.PT_LONG), "ITEM_ID", UUID.randomUUID(),
BitConverter.getBytesInt64(123));
MapiProperty namedProperty2 = new MapiNamedProperty(generateNamedPropertyTag(1L, MapiPropertyType.PT_LONG), 0x0000870C,
UUID.fromString("0006200A-0000-0000-C000-000000000046"), BitConverter.getBytesInt64(0));
newProperties.add(namedProperty1.getTag(), namedProperty1);
newProperties.add(namedProperty2.getTag(), namedProperty2);
newProperties.add(property.getTag(), property);
testFolder.changeMessages(testFolder.enumerateMessagesEntryId(), newProperties);
}
}
private static long generateNamedPropertyTag(long index, int dataType) {
return (((0x8000 | index) << 16) | (long) dataType) & 0x00000000FFFFFFFFL;
}
استخراج المرفقات دون استخراج الرسالة بالكامل
يمكن استخدام واجهة برمجة تطبيقات Aspose.Email لاستخراج المرفقات من رسائل PST دون استخراج الرسالة بالكامل أولاً. الـ ExtractAttachments طريقة من PersonalStorage يمكن استخدامها للقيام بذلك. يوضح مقطع الكود التالي كيفية استخراج المرفقات دون استخراج الرسالة بالكامل.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage personalstorage = PersonalStorage.fromFile(dataDir + "Outlook.pst")) {
FolderInfo folder = personalstorage.getRootFolder().getSubFolder("Inbox");
for (String messageInfo : folder.enumerateMessagesEntryId()) {
MapiAttachmentCollection attachments = personalstorage.extractAttachments(messageInfo);
if (attachments.size() != 0) {
for (MapiAttachment attachment : attachments) {
if (attachment.getLongFileName() != null && !attachment.getLongFileName().isEmpty()) {
if (attachment.getLongFileName().contains(".msg")) {
continue;
} else {
attachment.save(dataDir + "Attachments/" + attachment.getLongFileName());
}
}
}
}
}
}
إضافة ملفات إلى PST
الوظيفة الأساسية في Microsoft Outlook هي إدارة رسائل البريد الإلكتروني، والتقويمات، والمهام، وجهات الاتصال، وإدخالات اليوميات. بالإضافة إلى ذلك، يمكن إضافة ملفات إلى مجلد PST ويسجل PST الناتج الوثائق المضافة. توفر Aspose.Email إمكانية إضافة ملفات إلى مجلد بنفس الطريقة بالإضافة إلى إضافة الرسائل، وجهات الاتصال، والمهام وإدخالات اليوميات إلى PST. يوضح مقطع الكود التالي كيفية إضافة مستندات إلى مجلد PST باستخدام Aspose.Email.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// The path to the File directory.
String dataDir = "data/";
try (PersonalStorage personalStorage = PersonalStorage.create(dataDir + "Ps1_out.pst", FileFormatVersion.Unicode)) {
FolderInfo folder = personalStorage.getRootFolder().addSubFolder("Files");
// Add Document.doc file with the "IPM.Document" message class by default.
folder.addFile(dataDir + "attachment_1.doc", null);
}