C # Outlook 2007 надстройка: рекурсивный анализ почтовых элементов - PullRequest
1 голос
/ 16 ноября 2009

Я пишу надстройку для 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 ]

1 голос
/ 07 мая 2010

Вы должны использовать 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, которое возвращает COM-объект MailItem. Он также будет безопасно отфильтровывать несовместимые типы без исключения, поэтому вам не нужно добавлять null проверок.

API Extensions также решает проблему с отсутствующим базовым классом для элементов, так что вы можете наконец получить доступ к UserProperties и так далее через неуниверсальный базовый класс OutlookItem. Также API поддерживает некоторые атрибуты, которые могут повысить производительность запросов Linq , выполняя их на стороне Outlook, а не на COM. К сожалению, они плохо документированы.

1 голос
/ 16 ноября 2009

Я не очень хорошо знаком с объектной моделью outlook, но сразу скажу, что проблема в том, что вы неправильно предполагаете, что все элементы в папке являются MailItem экземплярами. Это также могут быть объекты типа ContactItem. Вам необходимо явно проверить, является ли значение MailItem, например,

foreach ( object current in folder.Items ) {
  MailItem mi = current as MailItem;
  if ( mi != null ) { 
    parser.parseMail(mi);
  }
}
0 голосов
/ 16 ноября 2009

foreach полезно для коллекции, которая реализует интерфейс IEnumerable. Согласно MSDN может показаться, что конкретная коллекция Items не поддерживает IEnumerable. Попробуйте использовать for цикл вместо:

int c = folder.Items.Count
for (i=0;i<=c;i++)
{
   //Do your thing
}
0 голосов
/ 16 ноября 2009

Я предполагаю, что MAPIFolder.Items не является строго типизированным, но вы перебираете его так, как будто это так. Я бы предложил пойти с:

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