2009-10-16 11 views
3

J'utilise le Outllok Interop pour déplacer des emails d'un dossier à un autre (après avoir obtenu toutes les pièces jointes, mais cela fonctionne) mais il ne copie pas tous les emails. J'ai essayé d'attendre, mais ça n'a pas d'effet. D'abord ça bouge 6, puis 3, puis 1. Quelqu'un peut-il me dire pourquoi ça ne les déplace pas tous?C# Outlook ne déplace pas tous les emails

code correspondant est ci-dessous:

Application oOutlook = new Application(); 
NameSpace oNs = oOutlook.GetNamespace("MAPI"); 

Recipient oRep = oNs.CreateRecipient("ContentHelp"); 
MAPIFolder inbox = oNs.GetSharedDefaultFolder(oRep, OlDefaultFolders.olFolderInbox); 

MAPIFolder nihSub = inbox.Folders["NIH"]; 
MAPIFolder nihArchive = inbox.Folders["NIHarchive"]; 
Items nihItems = nihSub.Items; 
MailItem moveMail = null; 
//inboxItems = inboxItems.Restrict("[Unread] = false"); 

int increment = 0; 

try 
{ 
    foreach (object collectionItem in nihItems) 
    { 
     moveMail = collectionItem as MailItem; 
     if (moveMail != null) 
     { 
      Console.WriteLine("Moving {0}", moveMail.Subject.ToString()); 
      string titleSubject = (string)moveMail.Subject; 
      moveMail.Move(nihArchive); 
     } 
    } 
} 

Répondre

5

L'indice se réinitialiser à chaque fois que vous en boucle sur le mouvement, donc vous ne serez jamais plus de la moitié des articles. Utilisez une boucle While ou un compte à rebours depuis olItems.Count to 1.

2

Une boucle arrière est une boucle allant du maximum au min.

IE:

for(int i = 10; i>0; i--) 
{ 
    Console.WriteLine(i); 
} 

Pour ce cas, vous pouvez utiliser quelque chose comme: (s'il vous plaît noter que je ne l'ai pas testé avec les objets perspectives de sorte que certains ajustements peuvent être nécessaires)

 for (int i=nihItems.count; i >= 0; i--) 
     { 
      moveMail collectionItem = nihItems[i] as MailItem 

      if (moveMail != null) 
      { 
       Console.WriteLine("Moving {0}", moveMail.Subject.ToString()); 
       string titleSubject = (string)moveMail.Subject; 
       moveMail.Move(nihArchive); 
      } 
     } 
+0

veuillez noter que cette réponse a été créée par demande d'un utilisateur anonyme pour le code final. Ceci n'est pas testé sur les objets Outlook, mais devrait donner une bonne idée de la façon dont cela pourrait être fait. –

0

Pas si joli, mais cela fonctionne:

Outlook.Folder FolderInbox = NameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox) as Outlook.Folder; 
List<Outlook.MailItem> MailItemList = new List<Outlook.MailItem>(); 
foreach (Outlook.MailItem item in FolderInbox.Items.OfType<Outlook.MailItem>()) 
    MailItemList.Add(item); 
foreach (Outlook.MailItem item in MailItemList) 
    ProcessMail(item); 
Questions connexes