【问题标题】:C# Outlook 2007 add-in: Recursive parsing of mail itemsC# Outlook 2007 插件:递归解析邮件项目
【发布时间】:2009-11-16 17:11:56
【问题描述】:

我正在为 Outlook 编写一个加载项,通过单击自定义上下文菜单按钮来解析文件夹中的所有邮件。我已经连接了按钮,但是当尝试使用文件夹中的 foreach 循环检查邮件项目时,它似乎只检查第一个。

我在这里获取文件夹详细信息:

void Application_FolderContextMenuDisplay(Office.CommandBar CommandBar, ***MAPIFolder Folder***)

然后我将它传递给解析器:

public void checkFolder(MAPIFolder folder)
    {
        MailParser parser = new MailParser();
        foreach (MailItem item in folder.Items)
        {
            parser.parseMail(item);
        }
    }

似乎是这里的 foreach 失败了。

有什么想法吗?这让我发疯了。

【问题讨论】:

  • 比“它失败”更具描述性的错误会大大帮助我们:D
  • 他很明确-它只迭代第一个项目。

标签: .net outlook-2007


【解决方案1】:

我对 Outlook 对象模型不是非常熟悉,但乍一看,我会说问题是您错误地假设文件夹中的所有项目都是 MailItem 实例。它们也可以是像ContactItem 这样的对象。您需要显式检查该值是否为MailItem 像这样

foreach ( object current in folder.Items ) {
  MailItem mi = current as MailItem;
  if ( mi != null ) { 
    parser.parseMail(mi);
  }
}

【讨论】:

    【解决方案2】:

    您应该使用 Microsoft.Office.Interop.Outlook.Extensions.Linq API,它允许类型安全地检索项目:

    public void checkFolder(MAPIFolder folder)
    {
        MailParser parser = new MailParser();
        IQueryable<Mail> query = folder.Items.AsQueryable<Mail>();
        foreach (MailItem wrappedItem in query)
        {
            parser.parseMail(wrappedItem.Item);
        }
    }
    

    这里的Mail 类型是OutlookItemBase&lt;TaskItem&gt; 的子类。它有一个Item 属性,它返回MailItem COM 对象。它还将安全地过滤掉不兼容的类型而不会引发异常,因此您不必添加 null 检查。

    Extensions API也解决了items缺少基类的问题,所以你终于可以通过非泛型的OutlookItem基类访问UserProperties等。 API 还支持一些属性,通过在 Outlook 端而不是在 COM 上执行它们,可以为 Linq 查询增加一些性能提升。不幸的是,它们没有得到很好的记录。

    【讨论】:

      【解决方案3】:

      我猜 MAPIFolder.Items 不是强类型的,但您正在对其进行迭代,就好像它是强类型一样。我建议去:

      foreach(object item in folder.Items)
      {
        if (item is MailItem)
          parser.parseMail((MailItem)item);
      }
      

      【讨论】:

        【解决方案4】:

        foreach 对于实现IEnumerable 接口的集合很有用。根据MSDN,似乎特定的Items 集合没有实现IEnumerable。尝试改用for 循环:

        int c = folder.Items.Count
        for (i=0;i<=c;i++)
        {
           //Do your thing
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-27
          • 1970-01-01
          • 2015-11-05
          • 2011-06-06
          • 2017-05-04
          • 2019-02-10
          • 2017-08-04
          • 1970-01-01
          相关资源
          最近更新 更多