1

好吧,我遇到了一个问题。

我正在使用 MS Outlook API 使用 C# 从收到的电子邮件中生成一些基于 excel 的报告。

现在最初当我开始这个时,没关系,因为文件夹中的电子邮件数量少了一点。现在几天后,这个数字已经达到了数千。

 Application app = null;
            _NameSpace ns = null;
            MailItem item = null;
            MAPIFolder inboxFolder = null;
            MAPIFolder subFolder = null;

            DateTime MyDateTime;
            MyDateTime = new DateTime();
            MyDateTime = DateTime.ParseExact(dateFilter, "yyyy-MM-dd HH:mm tt", null);

            try
            {
                app = new Application();
                ns = app.GetNamespace("MAPI");
                ns.Logon(null, null, false, false);

                inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
                subFolder = inboxFolder.Folders["Alerts"];


                for (int i = 1; i <= subFolder.Items.Count; i++)
                {
                    item = (Microsoft.Office.Interop.Outlook.MailItem)subFolder.Items[i];

                    string subject = item.Subject;
                    DateTime sent = item.SentOn;

                    if (item.SentOn > MyDateTime && item.SentOn < MyDateTime.AddDays(1))
{//Do some logging
}}

现在上面代码的问题是它从收到的最后一封电子邮件开始搜索。这导致它增加了到达“过滤器”所需的时间。

我需要改进我的代码的建议(如果有的话)。

谢谢你把我读出来。

4

2 回答 2

4

在循环之前,从通过 Restrict 方法过滤的 subFolder 中获取一组项目。您可以在您使用的过滤器字符串中使用您的日期范围(我没有在这里写它,因为我无法测试它并且不想误导您 - 搜索应该提供大量示例)。然后只需循环/迭代结果集合,该集合应该只包含您需要的项目。

Microsoft.Office.Interop.Outlook.Items restrictedItems = subFolder.Items.Restrict("*filter*");

for (int i = 1; i <= restrictedItems.Count; i++)...
于 2012-12-17T13:10:21.950 回答
0

这就是我过滤 Outlook 约会的方式。对于邮件,您需要 .olFolderInbox 而不是 .olFolderCalendar。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.outlook._items.restrict?view=outlook-pia

        Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();
        NameSpace mapiNamespace = oApp.GetNamespace("MAPI");
        MAPIFolder calendarFolder = mapiNamespace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);

        DateTime filterDate = DateTime.Now;
        string filterDateString = filterDate.Day + "/" + filterDate.Month + "/" + filterDate.Year + " 1:00am";
        string filter = "[CreationTime] > '" + string.Format(filterDateString, "ddddd h:nn AMPM") + "'";
        Items outlookCalendarItems = calendarFolder.Items.Restrict(filter);

        foreach (AppointmentItem item in outlookCalendarItems)
        {
           // Here I write to our database
        }
于 2022-02-11T14:34:07.790 回答