簡體   English   中英

Outlook加載項-無法使用foreach循環遍歷Outlook.Folder中的所有郵件項

[英]Outlook add-in - unable to iterate through all mailitems in Outlook.Folder using foreach loop

我的加載項使用針對Outlook 2007的Visual Studio2010。加載項的一項任務是將所有郵件項目從一個文件夾移動到指定的文件夾。

我的測試的第一階段只是修改了主題,並將電子郵件保存在同一文件夾中。 那里沒有問題。

當我從.Save方法更改為使用.Move方法時,我無法處理所有項目。 有些人不高興,然后foreach循環會過早退出而不會引發任何異常。

在我看來,我的測試數據受到了很好的控制,因為在我使用調試器遍歷代碼之前,我將項目手動移到要處理的文件夾中。 例如,在文件夾中有4個mailitem時,我可以移動其中2個,重新訪問foreach時它將退出循環,從而使2個mailitem未被處理。

有任何想法嗎?

        if (ProcessFolder(theRootFolder.FolderPath) && (theRootFolder.Items.Count > 0)) 
        {
            int itemCount = theRootFolder.Items.Count;
            int loopCount = 0;
            MetaDataForm getMetaData = new MetaDataForm(theRootFolder.FolderPath, theRootFolder.Items.Count);
            getMetaData.ShowDialog();
            if (getMetaData.DialogResult == DialogResult.OK)
            {
                string d1 = getMetaData.Meta1;
                string d2 = getMetaData.Meta2;
                try
                {
                    foreach (Object item in theRootFolder.Items)
                    {
                        loopCount++;
                        Outlook.MailItem mi = item as Outlook.MailItem;
                        if (mi != null)
                        {
                            mi.Move(_TRIM_archiveFolder);
                        }
                    }
                }
                catch (Exception ex)
                {
                    ex.ToString();      
                    MessageBox.Show(String.Format("ItemCount={0},LoopCount={1},ExceptionData={2}", 
                                                                itemCount, loopCount, ex));
                }
                MessageBox.Show(String.Format("ItemCount={0},LoopCount={1}",
                                                                itemCount, loopCount));
             }
         }

編輯:

好主意...向后循環解決了這個問題:

              // iterating backwards is needs because of .move below
                    for (int i = theRootFolder.Items.Count; i > 0; i--)
                    {
                        Outlook.MailItem mi = (Outlook.MailItem)theRootFolder.Items[i];
                        if (mi != null)
                        {
                            if (!mi.Subject.StartsWith("M1"))
                            {
                                mi.Move(_TRIM_archiveFolder);
                            }
                        }
                    }

通常,在使用foreach ,當要迭代的集合發生更改時,運行時不會過分喜歡它。

我在這里大膽猜測,但是我認為您可以將4個項目中的2個移出的原因是,當您進行第三次迭代時,剩下的兩個項目已移至Items集合中,並且現在就位當您查看位置2時為0和1。

使用Items.Count()> 0之類的for循環或while循環。

我還猜想您實際上在發生這種情況時會遇到異常,但它永遠不會冒出來。 嘗試將過程附加到WinDbg中,看看發生了什么。 您可能會遇到某種COM錯誤。

Outlook API幾乎不是所有COM庫嗎?

編輯:

你的想法是對的。 讓我想到了向后迭代的想法:

              // iterating backwards is needed because of .move below
                    for (int i = theRootFolder.Items.Count; i > 0; i--)
                    {
                        Outlook.MailItem mi = (Outlook.MailItem)theRootFolder.Items[i];
                        if (mi != null)
                        {
                            if (!mi.Subject.StartsWith("M1"))
                            {
                                mi.Move(_TRIM_archiveFolder);
                            }
                        }
                    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM