Microsoft Outlook Interop (извличане на прикачени файлове) много бавно

Използвам Microsoft.Office.Interop.Outlook за извличане на прикачени файлове към имейл:

var MAPI = new Application().GetNamespace("MAPI");
var ExampleFolder = MAPI.GetDefaultFolder(OlDefaultFolders.olFolderSentMail)

foreach (dynamic i in ExampleFolder.Items)
  if (i.Attachments.Count > 0)
    ; // DoSomething();

За съжаление това е изключително бавно.

  • Има ли по-бърз начин за проверка за прикачени файлове?
  • Възможно ли е да филтрирате/сортирате имейли по дата: преглед само на последните n елемента?

person fanti    schedule 12.06.2012    source източник
comment
някакво окончателно решение с пълен изходен код?   -  person Kiquenet    schedule 30.01.2013


Отговори (2)


разбира се, можете да сортирате колекцията с помощта на Items.Sort. Можете също да използвате Items.Find/FindNext или Items.Restrict, за да търсите само елементи с прикачени файлове. Свойството, от което се нуждаете, е PR_HASATTACH (DASL име http://schemas.microsoft.com/mapi/proptag/0x0E1B000B)

person Dmitry Streblechenko    schedule 12.06.2012
comment
Благодаря! Връзката ви не работи за съжаление. Бихте ли ми помогнали още малко? Опитах: ExampleFolder.Items.Restrict([PR_HAS_ATTACH]); без успех. - person fanti; 12.06.2012
comment
Това не е връзка, това е DASL името на свойството. Вижте msdn.microsoft.com/en-us/library/bb612664.aspx за пример - person Dmitry Streblechenko; 12.06.2012

@Kiquenet (не мога да добавя коментар под вашия), ето кода за получаване на елементи с прикачени файлове от Items.Restrict:

//fanti's code
var MAPI = new Application().GetNamespace("MAPI");
var ExampleFolder = MAPI.GetDefaultFolder(OlDefaultFolders.olFolderSentMail)

За да филтрирате по дата, просто добавете "И" или "ИЛИ" по този начин (Urn начин):

var itemsWithAttachmentAndDate = ExampleFolder.Items.Restrict("@SQL= urn:schemas:httpmail:hasattachment = True"
 + " AND urn:schemas:httpmail:datereceived <= '" + DateTime.Now.AddMonths(-3) + "'");

За да прегледате само последните n елемента:

int n = 3;
for (int i = itemsWithAttachmentAndDate.Count - 1; i > n; i--)
{
    //current item: itemsWithAttachmentAndDate[i] //Beware: "dynamic" typed!
    ; //DoSomething();
}
person Dinosaure    schedule 29.01.2019