کار با پیام‌ها در یک فایل PST

Contents
[ ]

افزودن پیام‌ها به فایل‌های PST

ایجاد یک فایل PST جدید و افزودن زیرپوشه‌ها نشان داد چطور یک فایل PST ایجاد کرده و یک زیرپوشه به آن اضافه کنید. با Aspose.Email می‌توانید پیام‌ها را به زیرپوشه‌های یک فایل PST که ایجاد یا بارگذاری کرده‌اید اضافه کنید. این مقاله دو پیام را از دیسک به زیرپوشه Inbox یک PST اضافه می‌کند. از … استفاده کنید PersonalStorage و FolderInfo کلاس‌ها برای افزودن پیام‌ها به فایل‌های PST. برای افزودن پیام‌ها به پوشه Inbox یک فایل PST:

  1. یک نمونه از کلاس FolderInfo ایجاد کنید و آن را با محتویات پوشه Inbox بارگذاری کنید.
  2. پیام‌ها را از دیسک به پوشه Inbox اضافه کنید با فراخوانی FolderInfo.addMessage() متد. FolderInfo کلاس موارد زیر را در دسترس قرار می‌دهد addMessages روشی که امکان افزودن تعداد زیادی پیام به پوشه را فراهم می‌کند، عملیات I/O به دیسک را کاهش داده و عملکرد را بهبود می‌بخشد. یک مثال کامل در زیر می‌تواند یافت شود، در افزودن پیام‌های جمعی.

قطعه کدهای زیر نشان می‌دهند که چگونه پیام‌ها را به زیرپوشه‌ای به نام Inbox در PST اضافه کنید.

// 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 به معنای عملیات I/O بیشتر به دیسک است و بنابراین ممکن است عملکرد را کاهش دهد. برای بهبود عملکرد، می‌توان پیام‌ها را به صورت جمعی به PST اضافه کرد تا عملیات I/O به حداقل برسد. این addMessages(Iterable messages) این روش به شما اجازه می‌دهد تا یک بازه از پیام‌ها را برای افزودن به PST تعریف کنید تا عملکرد بهبود یابد و می‌تواند در سناریوهای زیر استفاده شود. علاوه بر این، رویداد MessageAdded زمانی رخ می‌دهد که پیامی به پوشه اضافه شود.

بارگذاری پیام‌ها از دیسک

قطعه کد زیر نشان می‌دهد که چگونه پیام‌ها را از دیسک بارگذاری کنید.

// 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 را برمی‌گرداند. قطعه کد زیر نشان می‌دهد چگونه پیام‌ها را از PST دیگری اضافه کنید.

// 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());
}

دریافت اطلاعات پیام‌ها از یک فایل PST Outlook

در خواندن فایل PST اوتلوک و دریافت اطلاعات پوشه‌ها و زیرپوشه‌ها، ما در مورد بارگذاری یک فایل PST Outlook و مرور پوشه‌های آن برای دریافت نام پوشه‌ها و تعداد پیام‌ها در آن‌ها بحث کردیم. این مقاله توضیح می‌دهد چگونه تمام پوشه‌ها و زیرپوشه‌های فایل PST را بخوانید و اطلاعات پیام‌ها مانند موضوع، فرستنده و گیرندگان را نمایش دهید. FolderInfo.getContents() متد برای نمایش اطلاعات مختصر پیام مانند موضوع، فرستنده، گیرندگان. از نظر عملکرد، این مناسب‌ترین گزینه برای دریافت اطلاعات اولیه درباره پیام‌ها است. برای استخراج داده کامل پیام، PersonalStorage.extractMessage() یک متد فراهم شده است. فایل PST Outlook ممکن است شامل پوشه‌های تو در تو باشد. برای دریافت اطلاعات پیام از این‌ها و همچنین پوشه‌های سطح بالا، از یک متد بازگشتی برای خواندن تمام پوشه‌ها استفاده کنید. قطعه کد زیر نشان می‌دهد چگونه یک فایل PST Outlook را بخوانید و محتویات پوشه‌ها و پیام‌ها را به‌صورت بازگشتی نمایش دهید.

// 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

این مقاله نشان می‌دهد چگونه فایل‌های PST مایکروسافت Outlook را بخوانیم و پیام‌ها را استخراج کنید. سپس پیام‌ها به‌صورت فایل 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

اضافه کردن پیام‌ها به فایل‌های PST نشان داد چگونه پیام‌ها را به فایل‌های PST اضافه کنیم. البته می‌توان آیتم‌ها (محتواها) را از یک فایل PST حذف کرد و ممکن است حذف پیام‌ها به‌صورت گروهی نیز مطلوب باشد. آیتم‌های یک فایل PST می‌توانند با استفاده از FolderInfo.deleteChildItem() متد. API همچنین ارائه می‌دهد FolderInfo.deleteChildItems() متد برای حذف آیتم‌ها به‌صورت گروهی از فایل PST.

حذف پیام‌ها از فایل‌های PST

این مقاله نشان می‌دهد چگونه از FolderInfo کلاسی برای دسترسی به پوشه‌های خاص در یک فایل PST. برای حذف پیام‌ها از زیرپوشه Sent یک فایل PST که قبلاً بارگذاری یا ایجاد شده است:

  1. یک نمونه از FolderInfo کلاس و بارگذاری آن با محتویات زیرپوشه Sent.
  2. حذف پیام‌ها از پوشه Sent با فراخوانی FolderInfo.deleteChildItem() متد و عبور دادن MessageInfo.EntryId به‌عنوان پارامتر. قطعه کد زیر نشان می‌دهد چگونه پیام‌ها را از زیرپوشه Sent یک فایل 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

API Aspose.Email می‌تواند برای حذف آیتم‌ها به‌صورت گروهی از یک فایل 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 برای Java می‌توان پیام‌های به‌صورت دائمی حذف‌شده را بازیابی کرد. API این کتابخانه امکان فهرست‌برداری از پیام‌های حذف نرم در فایل‌های 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 علامت‌گذاری شوند. API 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;
}

استخراج پیوست‌ها بدون استخراج کامل پیام

API 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);
}