2011-02-01 2 views
0

J'essaie de collecter toutes les tâches d'un jour spécifié dans le corps d'un nouveau message électronique. Ceci doit inclure les courriels qui ont été marqués pour le suivi.Comment sélectionner tous les emails dans Outlook qui sont marqués pour le suivi d'un jour spécifique (C# Outlook AddOn)

Le code suivant fait ce que j'ai besoin de faire, mais très lentement. L'itération à travers tous les messages e-mail est où le code gaspille beaucoup de temps (childFolder.DefaultItemType == Outlook.OlItemType.olMailItem):

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; 
} 

Est-il possible de filtrer les éléments dans le dossier? Les méthodes Find et FindNext semblent prometteuses, mais je ne trouve pas comment spécifier que le filtre utilisé est appliqué aux éléments IsMarkedAsTask et TaskDueDate de l'élément.

+0

Comment est-ce hors-sujet? –

+0

Je vous suggère de ne plus utiliser 'ArrayList'. Pourquoi ne pas utiliser 'List ' à la place? –

+0

Merci, mais cela ne résout pas mon problème. Le problème est que je dois parcourir tous les emails du dossier testant chacun individuellement si c'est IsMarkedAsTask et que TaskDueDate correspond à mes paramètres de recherche. C'est SLOW, et la méthode Find ne semble fonctionner que sur les champs d'email standards comme Subject (au moins je ne trouve nulle part de documentation montrant comment l'utiliser pour filtrer sur IsMarkedAsTask). –

Répondre

Questions connexes