如何使用Linq Outlook C#从存储中的所有文件夹中搜索电子邮件

时间:2019-07-01 10:22:09

标签: c# outlook vsto outlook-addin

我正在通过VSTO加载项对所有传入的答复执行自定义操作。加载项将传入回复的ConversationID与现有电子邮件进行比较。如果我必须在一个文件夹中搜索,效果很好,但我的问题是电子邮件可以在商店的任何文件夹中。这是我的代码。

void items_ItemAdd(object Item)
        {
            Outlook.Application application = new Outlook.Application();
            string filter = "RE: ";
            Outlook.MailItem mail = (Outlook.MailItem)Item;
            Outlook.Folder folder = mail.Parent as Outlook.Folder;
            if (Item != null)
            {
                if (mail.MessageClass == "IPM.Note" && mail.Subject.ToUpper().Contains(filter.ToUpper()))
                {
                    var RequiredMail = (from e in folder.Items.Cast<Outlook.MailItem>().OrderBy(X => X.ReceivedTime).Where(C => C.ConversationID == mail.ConversationID) select mail).FirstOrDefault();

                    // Perform custom action
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }

此外,我已经阅读到使用Linq搜索电子邮件不是很有效。还有其他更有效的方法来获取RequiredMail吗?

我们将不胜感激任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

首先,您必须意识到如果将超过16个项目添加到集合中,则可能不会触发ItemAdd事件。这是Outlook中的一个已知问题。以下系列文章介绍了可能的解决方法:

混合LINQ和COM对象不是一个好主意。您应该立即释放基础COM对象,以防止出现任何已知问题。

如果需要搜索所有文件夹中的项目,则可以使用Application类的AdvancedSearch方法,该方法允许基于指定的DAV搜索和定位(DASL)搜索字符串执行搜索。

在Outlook中使用AdvancedSearch方法的主要好处是:

  • 搜索是在另一个线程中执行的。您无需手动运行其他线程,因为AdvancedSearch方法会在后台自动运行该线程。
  • 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件,约会,日历,便笺等。可以将RestrictFind / FindNext方法应用于特定的Items集合(请参阅Outlook中Folder类的Items属性)。
  • 完全支持DASL查询(自定义属性也可用于搜索)。您可以在MSDN的Filtering文章中了解有关此内容的更多信息。为了提高搜索性能,如果为商店启用了“即时搜索”,则可以使用“即时搜索”关键字(请参阅Store类的IsInstantSearchEnabled属性)。
  • 您可以随时使用Stop类的Search方法停止搜索过程。

Advanced search in Outlook programmatically: C#, VB.NET文章中了解有关此内容的更多信息。