1

我正在为 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 似乎失败了。

有任何想法吗?这让我发疯了。

4

4 回答 4

1

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

foreach ( object current in folder.Items ) {
  MailItem mi = current as MailItem;
  if ( mi != null ) { 
    parser.parseMail(mi);
  }
}
于 2009-11-16T17:18:44.993 回答
1

您应该使用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<TaskItem>。它有一个Item返回MailItemCOM 对象的属性。它还将安全地过滤掉不兼容的类型而不会引发异常,因此您不必添加检查。

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

于 2010-05-07T14:11:40.743 回答
0

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

foreach(object item in folder.Items)
{
  if (item is MailItem)
    parser.parseMail((MailItem)item);
}
于 2009-11-16T17:18:32.077 回答
0

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

int c = folder.Items.Count
for (i=0;i<=c;i++)
{
   //Do your thing
}
于 2009-11-16T17:18:38.113 回答