2009-10-16 49 views
3

我正在使用Outllok Interop将电子邮件从一个文件夹移动到另一个文件夹(在获得所有附件之后,但可行),但不会复制所有电子邮件。我试过等待,但没有效果。首先它会移动6,然后是3,然后是1.谁能告诉我为什么不把它们全部移动?C#Outlook并未移动所有电子邮件

相关代码如下:

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

回答

5

指数得到重置每次你在循环移动,所以你永远不会超过一半的项目。 使用While循环或从olItems.Count到1的倒计时。

2

向后循环是从最大值到最小值的一个。

IE:

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

对于这种情况下,你可以使用这样的:(请注意我没有测试与Outlook对象,因此可能需要一些调整)

 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

请注意,这个答案是根据匿名用户对最终代码的请求创建的。这是未经测试的Outlook对象,但应该给出如何完成它的好主意。 – 2010-01-22 15:46:45

0

事实并非如此漂亮,但它的作品:

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); 
相关问题