访问 Outlook ost 文件

2023-12-07

我已经看到了 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;
}

在我弄清楚如何实际构建 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,对于枚举文件夹:https://msdn.microsoft.com/en-us/library/office/ff184607.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问 Outlook ost 文件 的相关文章

随机推荐

  • JSF PRG 存在验证错误

    我正在使用带有 PRG 模式的 JSF 在我的导航规则中使用 问题是当我收到验证错误时 例如 用户未设置强制值 重定向未完成 即发布后紧接着获取同一页面 场景是 用户没有输入必填值并提交表单 发生验证错误 并且显示相同视图时出现错误 消息
  • 如何在 ASP.Net MVC 中初始化 Webhook 接收器

    我正在遵循本指南here用于在 ASP Net MVC 中安装和使用 webhook 但看起来本指南适用于 wep api 类型项目 我正在使用 MVC 类型的项目 并且没有 Register 方法 这与 API 项目不同 在 MVC 中
  • 相当于Angular2中的ng-repeat来获取JSON对象的键[重复]

    这个问题在这里已经有答案了 我正在寻找一种使用 Angular2 将 JSON 对象浏览到 HTML 页面的方法 为了得到每个键和每个值 在 AngularJS 中 可以使用指令ng repeat div key div 但在 Angula
  • 如何使用 SharpSVN 访问预提交挂钩中的文件信息

    总的来说 我对 SharpSVN 和 SVN 很陌生 我正在尝试实现一个预提交挂钩 当用户提交某种类型的 XML 文件时 在允许提交文件之前 我需要拦截该文件并对其进行分析 以确保它们包含某些元素 由于 SVN 似乎提交了两个参数 存储库路
  • 获取具有特定时间的 Date() 对象

    我想获取一周的开始日期 我能够获取日期 只是返回的日期具有当前系统时间的时间 例如 如果现在是 19 20 我得到的周开始日期为日期 2012 年 3 月 26 日星期一 19 20 16 GMT 0530 IST 为了准确计算 我需要时间
  • React js从父组件更改子组件的状态

    我有两个组件 父组件我想从中更改子组件的状态 class ParentComponent extends Component toggleChildMenu render return div div
  • SwiftUI显示gif图像

    swiftUI中显示动画gif图片的方法 因为图像 Image fall leaves 不支持gif 回答如下 在 swiftUI 中显示 gif 图像的最简单 最快的方法是使用Preview QuickLook QL QLPreviewV
  • 在sql中生成随机名称

    我有 5 个男性和女性的随机名字 我需要根据性别插入随机名称 但是我们如何在 SQL 中从一组 5 个名称中随机插入名称 是否可以 select name from table order by newid
  • JSF 中组件的水平放置

    应该很简单 但我找不到答案 我想水平放置组件而不是垂直放置 我想要实现的是一个丰富的 具有 2 行或更多行的工具栏 我一直在尝试使用具有面板网格和两个面板组的工具栏来做到这一点 如下所示
  • 如何让窗口绝对置顶?

    我用设置窗口位置api 使用 HWND TOPMOST 参数使我的窗口位于最顶层 它工作正常 但工具提示仍然位于其之上 如何让我的窗口位于所有窗口之上 我缺少一个 api 吗 Edit 我用计时器检查前景窗口然后将我的窗口设置为最上面来修复
  • Ramda:通过与另一个数组中的每个项目进行比较来从数组中获取对象

    我有一个像这样的数组 ids 1 3 5 和另一个数组 例如 items id 1 name a id 2 name b id 3 name c id 4 name d id 5 name e id 6 name f 我想要的是另一个数组
  • Mavericks 安装后 Sublime Text 2 命令行无法运行

    我已经准备好通过 Stack Overflow 上的其他线程 尽管我付出了努力 但问题似乎并未解决 自从安装 OS X Mavericks 以来 我无法从命令行打开 Sublime Text 2 我尝试遵循以下准则 http benkwok
  • 自定义将结构解组为切片映射

    我以为我现在已经理解了解组 但我想还没有 我在用 Go 解组地图时遇到了一些麻烦 这是我到目前为止的代码 type OHLC RESS struct Pair map string Candles Last int64 json last
  • 在发布到服务器之前如何正确地将文件附加到 formData?

    我一直在关注这个FormData 教程在这里 但尚未了解如何表单数据对象 works 我的输入表格
  • 运行时错误 287 - 设置 Inspector.wordeditor 时的 Outlook

    Set oApp CreateObject Outlook Application Set oMailItem oApp CreateItem 0 oMailItem BodyFormat olFormatRichText Set oIns
  • 对 Amazon Alexa Skill Kit (ASK) Lambda 交互进行故障排除

    我从 ASK 开发开始 我对某些行为有点困惑 我想知道如何从 服务模拟器 控制台调试错误 我怎样才能获得更多关于The remote endpoint could not be called or the response it retur
  • C++17 可选树,错误:不完整类型的无效使用

    当我编译包含可选类型的二叉树时 include
  • 无法添加或更新子行,外键约束失败[重复]

    这个问题在这里已经有答案了 1452 无法添加或更新子行 外键约束失败 projectphp1707 sql e6c cd 约束 sql e6c cd ibfk 1外键 order id 参考tbl order order id table
  • javascript更改点击时的背景颜色[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 你能告诉我 Javascript 吗 它允许你将页面的背景颜色更改为另一种颜色 例如 我有蓝色背景颜色 我想将其更改为绿色 当用户按下触发事件的按钮时 必须更改颜色 我看到它存在
  • 访问 Outlook ost 文件

    我已经看到了 pst 和 ost 文件之间的区别 目前正在通过下面给出的代码访问 Outlook pst 文件 有没有办法使用相同的代码来访问 ost 文件 有人可以向我推荐这个吗 private DataTable GetInboxIte