C#Outlook 2007加载项:递归解析邮件项目

时间:2009-11-16 17:11:56

标签: .net outlook-2007

我正在为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 个答案:

答案 0 :(得分:1)

我对outlook对象模型并不是非常熟悉,但是我一眼就会说问题是你错误地认为文件夹中的所有项都是MailItem个实例。它们也可以是ContactItem之类的对象。您需要明确检查该值是否为MailItem,如此

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

答案 1 :(得分: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属性,返回MailItem COM对象。它还可以安全地过滤掉不兼容的类型而不会抛出异常,因此您不必添加 null 检查。

Extensions API 还解决了项目缺少的基类问题,因此您最终可以通过非通用UserProperties基类访问OutlookItem等。此外,API支持一些属性,这些属性可以通过在Outlook端执行它们而不是通过COM在 Linq 查询中添加一些性能提升。不幸的是,它们没有很好的记录。

答案 2 :(得分:0)

我猜测MAPIFolder.Items不是强类型的,但你正在迭代它,就好像它一样。我建议一起去:

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

答案 3 :(得分:0)

foreach对于实现IEnumerable接口的集合很有用。根据{{​​3}},似乎特定Items集合未实现IEnumerable。请尝试使用for循环:

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