2011-02-01 4 views
0

새 전자 메일 메시지의 본문에 지정된 요일의 모든 작업을 수집하려고합니다. 후속 조치로 표시된 이메일을 포함합니다.특정 날짜 (C# Outlook AddOn)에 대한 후속 조치로 표시된 모든 전자 메일을 Outlook에서 선택하는 방법

다음 코드는 필요한 작업을 수행하지만 매우 느립니다.

public static void AddTaskList(DateTime tasksDate, Boolean append) 
{ 
    // need to create a variable with the date of 1/1/4501 12:00:00 AM (this counts as the empty date in Outlook) 
    DateTime nonDate = new DateTime(4501, 1, 1); 

    Cursor.Current = Cursors.WaitCursor; 

    Outlook.Application application = Globals.ThisAddIn.Application; 
    Outlook.Inspector inspector = application.ActiveInspector(); 
    Outlook.MailItem myMailItem = (Outlook.MailItem)inspector.CurrentItem; 

    string body = ""; 

    body += "\nExtracted from Outlook tasks (" + tasksDate.ToShortDateString() + "):\n\n"; 

    Outlook.Folder root = application.Session.DefaultStore.GetRootFolder() as Outlook.Folder; 

    // Find the tasks folder and extract all the tasks for the specified day 
    ArrayList taskList = new ArrayList(); 
    foreach (Outlook.Folder childFolder in root.Folders) 
    { 
     if (childFolder.DefaultItemType == Outlook.OlItemType.olTaskItem) 
     { 
      foreach (Outlook.TaskItem item in childFolder.Items) 
      { 
       if (item.ConversationTopic != null && item.DueDate.Equals(tasksDate)) 
       { 
        TaskItem myTask = new TaskItem(); 

        myTask.Subject = item.Subject.ToString(); 
        myTask.ToDoTaskOrdinal = item.ToDoTaskOrdinal; 
        myTask.Complete = item.Complete; 

        taskList.Add(myTask); 
       } 
      } 
     } 
     else if (childFolder.DefaultItemType == Outlook.OlItemType.olMailItem) 
     { 
      foreach (object item in childFolder.Items) 
      { 
       Outlook.MailItem mail = item as Outlook.MailItem; 
       if (mail != null) 
       { 
        if (mail.IsMarkedAsTask && mail.TaskDueDate.Equals(tasksDate)) 
        { 
         TaskItem myTask = new TaskItem(); 

         myTask.Subject = mail.TaskSubject.ToString(); 
         myTask.ToDoTaskOrdinal = mail.ToDoTaskOrdinal; 
         if (mail.TaskCompletedDate.Equals(nonDate)) 
         { 
          myTask.Complete = false; 
         } 
         else 
         { 
          myTask.Complete = true; 
         } 

         taskList.Add(myTask); 
        } 
       } 
      } 
     } 
    } 

    if (taskList.Count == 0) 
    { 
     body += "\tNo tasks found...\n"; 
    } 
    else 
    { 
     Boolean completeTasksFound = false; 

     // Sort the task list by the ordinals and then add to body of email 
     taskList.Sort(); 
     foreach (TaskItem task in taskList) 
     { 
      String taskLineOut = "\t" + task.Subject; 
      if (task.Complete) 
      { 
       taskLineOut += "*"; 
       completeTasksFound = true; 
      } 
      taskLineOut += "\n"; 

      body += taskLineOut; 
     } 

     if (completeTasksFound) 
     { 
      body += "* completed\n\n"; 
     } 
     else 
     { 
      body += "\n"; 
     } 
    } 

    if (append) 
    { 
     myMailItem.Body += body; 
    } 
    else 
    { 
     myMailItem.Body = body; 
    } 

    Cursor.Current = Cursors.Default; 
} 

폴더의 항목을 필터링하는 몇 가지 방법이 있나요 : 코드가 많은 시간 (childFolder.DefaultItemType == Outlook.OlItemType.olMailItem)을 낭비 경우 모든 이메일 메시지를 통해 반복은? Find 및 FindNext 메서드는 유망 해 보이지만 사용 된 필터가 항목의 IsMarkedAsTask 및 TaskDueDate 요소에 적용되도록 지정하는 방법을 찾을 수 없습니다.

+0

방법이 주제에서 벗어난는? –

+0

'ArrayList'사용을 중단하는 것이 좋습니다. 대신'List '을 사용하지 않으시겠습니까? –

+0

고마워,하지만 그건 내 문제를 해결하지 않습니다. 문제는 IsMarkedAsTask이고 TaskDueDate가 검색 매개 변수와 일치하는 경우 폴더의 모든 이메일을 개별적으로 테스트하여 이메일을 반복해야한다는 것입니다. 이것은 느리고 Find 메서드는 Subject와 같은 표준 전자 메일 필드에서만 작동하는 것처럼 보입니다. 적어도 IsMarkedAsTask에서 필터링하는 데 사용하는 방법을 보여주는 설명서는 어디에도 없습니다. –

답변

관련 문제