4

我已经看到了 pst 和 ost 文件之间的区别,目前正在通过下面给出的以下代码访问 Outlook pst 文件。有没有办法使用相同的代码来访问 ost 文件?有人可以参考我吗?

private DataTable GetInboxItems()
{
    DataTable inboxTable;
    //try
    //{
    filter = "[ReceivedTime] >= '" + dtpStartDate.Value.ToString("dd/MM/yyyy 12:00 AM")   + "' and [ReceivedTime] <= '" + dtpEndDate.Value.ToString("dd/MM/yyyy  11:59 PM") + "'";
    Outlook.Application outlookApp = GetApplicationObject();
    Outlook.Folder root = outlookApp.Session.DefaultStore.GetRootFolder() as  Outlook.Folder;
    EnumerateFolders(root);
    //string filter = "[ReceivedTime] > '" + dtpStartDate.Value.ToString("dd/MM/yyyy")  + "'";

    //inbox
    Outlook.MAPIFolder inboxFolder =  outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
    inboxTable = CreateTable();
    int count = 0;


    if (inboxFolder.Items.Count > 0)
    {

        var restrictedItems = inboxFolder.Items.Restrict(filter);
        restrictedItems.Sort("[ReceivedTime]", true); //descending
        //foreach (var item in inboxFolder.Items)
        foreach (var item in restrictedItems)
        {
            var mail = item as Outlook.MailItem;
            if (mail != null)
            {
                //try
                //{
                DataRow row = inboxTable.NewRow();
                //row["sn"] = (++count).ToString();
                row["sn"] = mail.EntryID + " " + mail.ReceivedByEntryID;
                row["MailType"] = "Inbox";
                row["SenderName"] = mail.SenderName;
                row["SenderEmail"] = mail.SenderEmailAddress;
                row["ReceivedDate"] = mail.ReceivedTime;
                row["Subject"] = mail.Subject;
                row["Body"] = mail.Body != null ? (mail.Body.Length > 25 ?  mail.Body.Substring(0, 25) : mail.Body) : null;
                //row["Body"] = mail.Body != null ? mail.Body : "";
                row["MailSize"] = mail.Size.ToString();
                string attachments = null;
                if (mail.Attachments.Count > 0)
                {
                    foreach (var attachment in mail.Attachments)
                    {
                        if (((Outlook.Attachment)attachment) != null)
                            //attachments = ((Outlook.Attachment)attachment).FileName +  " " + ((Outlook.Attachment)attachment).Size.ToString() + ", ";
                            attachments += (((Outlook.Attachment)attachment).Size / 1024).ToString() + " KB, ";
                    }
                }


                row["AttachmentCount"] = mail.Attachments.Count;
                if (attachments != null)
                    row["AttachmentSize"] = attachments.Substring(0, attachments.Length - 2);

                inboxTable.Rows.Add(row);
            }
            //catch (Exception ex)
            //{

            //    return null;
            //}

        }
    }

    return inboxTable;
}
4

2 回答 2

4

在我弄清楚如何实际构建 OP 提供的代码后,我发现开始使用 Outlook 非常有用,所以我想在下面分享完成的代码。

using System;
using System.Collections.Generic;//List
using System.Linq;//Array
//using System.Text;
//using System.Threading.Tasks;
using System.Diagnostics;//Process
using System.Runtime.InteropServices;//Marshal
using System.Data;//DataTable
using System.Reflection;//Missing
using Microsoft.Office.Interop.Outlook;//.OST files, needs Microsoft.Office.Interop.Outlook.dll

//TO DO: If you use the Microsoft Outlook 11.0 Object Library, uncomment the following line.
using Outlook = Microsoft.Office.Interop.Outlook;

namespace WatchOutlookMails
{
    class StoreFormat
    {
        public DataTable GetInboxItems(DateTime dtpStartDate, DateTime dtpEndDate)
        {
            DataTable inboxTable;
            string filter = string.Format("[ReceivedTime] >= '{0:dd/MM/yyyy 12:00 AM}' and [ReceivedTime] <= '{1:dd/MM/yyyy 11:59 PM}'", dtpStartDate, dtpEndDate);
            Outlook.Application outlookApp = GetApplicationObject();
#if false//only needed if you want to select another folder
            Outlook.Folder root = outlookApp.Session.DefaultStore.GetRootFolder() as Outlook.Folder;
            EnumerateFolders(root);
#endif
            //inbox
            Outlook.MAPIFolder inboxFolder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
            inboxTable = CreateTable();
            if (inboxFolder.Items.Count > 0)
            {
                Items restrictedItems = inboxFolder.Items.Restrict(filter);
                const bool SortDescending = true;
                restrictedItems.Sort("[ReceivedTime]", SortDescending);
                foreach (var item in restrictedItems)//item is a "COM Object" (?)
                {
                    MailItem mail = item as Outlook.MailItem;
                    if (mail != null)
                    {
                        //try
                        //{
                        DataRow row = inboxTable.NewRow();
                        //row["sn"] = (++count).ToString();
                        row["sn"] = mail.EntryID + " " + mail.ReceivedByEntryID;
                        row["MailType"] = "Inbox";
                        row["SenderName"] = mail.SenderName;
                        row["SenderEmail"] = mail.SenderEmailAddress;
                        row["ReceivedDate"] = mail.ReceivedTime;
                        row["Subject"] = mail.Subject;
                        row["Body"] = mail.Body != null ? (mail.Body.Length > 25 ? mail.Body.Substring(0, 25) : mail.Body) : null;
                        //row["Body"] = mail.Body != null ? mail.Body : "";
                        row["MailSize"] = mail.Size.ToString();
                        int AttachmentSize = 0;
                        foreach (Outlook.Attachment attachment in mail.Attachments)
                        {
                            if (attachment != null)
                                AttachmentSize += attachment.Size;
                        }
                        row["AttachmentCount"] = mail.Attachments.Count;
                        row["AttachmentSize"] = AttachmentSize;
                        inboxTable.Rows.Add(row);
                        //catch (Exception ex)
                        //{
                        //    break;
                        //}
                    }
                }
            }
            return inboxTable;
        }

        private DataTable CreateTable()
        {
            DataTable T = new DataTable();
            T.Columns.Add("sn", typeof(string));
            T.Columns.Add("MailType", typeof(string));
            T.Columns.Add("SenderName", typeof(string));
            T.Columns.Add("SenderEmail", typeof(string));
            T.Columns.Add("ReceivedDate", typeof(string));
            T.Columns.Add("Subject", typeof(string));
            T.Columns.Add("Body", typeof(string));
            T.Columns.Add("MailSize", typeof(int));
            T.Columns.Add("AttachmentCount", typeof(int));
            T.Columns.Add("AttachmentSize", typeof(int));
            return T;
        }

        private void EnumerateFoldersInDefaultStore()
        {
            Outlook.Application outlookApp = GetApplicationObject();
            Outlook.Folder root = outlookApp.Session.DefaultStore.GetRootFolder() as Outlook.Folder;
            EnumerateFolders(root);
            return;
        }

        private void EnumerateFolders(Outlook.Folder folder)
        {
            Outlook.Folders childFolders = folder.Folders;
            if (childFolders.Count > 0)
            {
                foreach (Outlook.Folder childFolder in childFolders)
                {
                    // Write the folder path.
                    //Debug.WriteLine(childFolder.FolderPath);
                    // Call EnumerateFolders using childFolder.
                    // Uses recursion to enumerate Outlook subfolders.
                    EnumerateFolders(childFolder);
                }
            }
            return;
        }

        /// <summary>
        /// obtain an Application object that represents an active instance of Microsoft Outlook, 
        /// if there is one running on the local computer, or to create a new instance of Outlook, 
        /// log on to the default profile, and return that instance of Outlook
        /// </summary>
        /// <returns></returns>
        private Outlook.Application GetApplicationObject()
        {
            // source: https://msdn.microsoft.com/en-us/library/ff462097.aspx
            Outlook.Application application = null;

            // Check whether there is an Outlook process running.
            if (Process.GetProcessesByName("OUTLOOK").Count() > 0)
            {

                // If so, use the GetActiveObject method to obtain the process and cast it to an Application object.
                application = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
            }
            else
            {

                // If not, create a new instance of Outlook and log on to the default profile.
                application = new Outlook.Application();
                Outlook.NameSpace nameSpace = application.GetNamespace("MAPI");
                nameSpace.Logon("", "", Missing.Value, Missing.Value);
                nameSpace = null;
            }

            // Return the Outlook Application object.
            return application;
        }
    }//end class
}//end ns

为了填补缺失的部分,我从https://support.microsoft.com/en-us/kb/310259借用了 EnumerateFolders:https ://msdn.microsoft.com/en-us/library/office/ff184607 .aspx

于 2015-12-03T11:47:08.963 回答
2

您需要了解 OST/PST 是什么,因为对它们的访问没有太大区别,两者都是Store对象,因此它们具有相同的接口。

尝试这些资源作为开始并自己进行实验,因为这是了解事物如何工作的最佳方式。

http://en.wikipedia.org/wiki/Personal_Storage_Table

http://msdn.microsoft.com/en-us/library/bb609139(v=office.14).aspx

http://msdn.microsoft.com/en-us/library/ff184648(v=office.14).aspx

http://msdn.microsoft.com/en-us/library/bb208208(v=office.12).aspx

http://www.c-sharpcorner.com/UploadFile/rambab/OutlookIntegration10282006032802AM/OutlookIntegration.aspx

于 2013-05-08T07:18:49.700 回答