Почему эта итерация папки Outlook обрабатывает не более половины элементов в папке?

Правила Outlook помещают всю исходящую почту Facebook в папку Facebook, выполняется внешний процесс, описанный здесь, для разделения содержимого этой папки способом, который был невозможен с помощью процесса правил Outlook, изначально этот процесс выполнялся в VBA в Outlook но это была свинья, задыхающаяся от ресурсов Outlook. Поэтому я решил выбросить его извне, и, поскольку я хочу улучшить свой набор навыков С#, это будет одновременно преобразованием. В любом случае обработка почты работает так, как должна, элементы будут исправлять подпапки, но по какой-то причине временное ограничение на выход после i-го числа итераций не работает должным образом. Если в папке Facebook есть 800 писем (я являюсь членом многих групп), он проходит только 400 итераций, если их 30, он обрабатывает только 15 и т. д.

Я не могу понять, почему - кто-нибудь может меня исправить? Спасибо

        private void PassFBMail()
        {
            //do something
            // result = MsgBox("Are you sure you wish to run the 'Allocate to FB Recipient' process", vbOKCancel, "Hold up")
            //If result = Cancel Then Exit Sub
            var result = MessageBox.Show("Are you sure you wish to run the Are you sure you wish to run the 'Allocate to SubFolders' process","Sure?",MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2);
            if (result == DialogResult.Cancel)
            {
                return; 
            }

            try
            {
                OutLook._Application outlookObj = new OutLook.Application();

                OutLook.MAPIFolder inbox = (OutLook.MAPIFolder)
                           outlookObj.Session.GetDefaultFolder(OutLook.OlDefaultFolders.olFolderInbox);

                OutLook.MAPIFolder fdr = inbox.Folders["facebook"];
                OutLook.MAPIFolder fdrForDeletion = inbox.Folders["_ForDeletion"];
//                foreach (OutLook.MAPIFolder fdr in inbox.Folders)
//                {
//                    if (fdr.Name == "facebook")
//                    {
//                        break;
//                    }
//                }

                //openFacebookFolder Loop through mail
                           //LOOPING THROUGH MAIL ITEMS IN THAT FOLDER.
                Redemption.SafeMailItem sMailItem = new Redemption.SafeMailItem();

                int i = 0;                
                foreach ( Microsoft.Office.Interop.Outlook._MailItem mailItem in fdr.Items.Restrict("[MessageClass] = 'IPM.Note'"))
                {
                    //temp only process 500 mails
                    i++;
                    if (i == 501) 
                    {
                        break;
                    }
//                  eml.Item = em
//                  If eml.To <> "" And eml.ReceivedByName <> "" Then
//                        strNewFolder = DeriveMailFolder(eml.To, eml.ReceivedByName)
//                  End If

                    sMailItem.Item = mailItem;

                    string strTgtFdr = null;

                    if (sMailItem.To != null  && sMailItem.ReceivedByName != null) 
                    {
                        strTgtFdr = GetTargetFolder(sMailItem.To, sMailItem.ReceivedByName );
                    }

//                    If fdr.Name <> strNewFolder Then
//                        If dDebug Then DebugPrint "c", "fdr.Name <> strNewFolder"
//                        eml.Move myInbox.Folders(strNewFolder)
//                        If dDebug Then DebugPrint "w", "myInbox.Folders(strNewFolder) = " & myInbox.Folders(strNewFolder)
//                    Else
//                        eml.Move myInbox.Folders("_ForDeletion")
//                    End If
                    if (fdr.Name != strTgtFdr)
                    {
                        OutLook.MAPIFolder destFolder = inbox.Folders[strTgtFdr];
                        mailItem.Move(destFolder);
                    }
                    else
                    {
                        mailItem.Move(fdrForDeletion);
                    }

                }




            //allocate to subfolders

            //Process othersGroups
            //Likes Max 3 per day  per user, max 20% of group posts
            //Comments one per day per user, max 10% of group posts
            //Shares one per day per user, max 10% of group posts
            }
            catch(System.Exception crap)
            {
                OutCrap(crap);
                MessageBox.Show("MailCamp experienced an issues while processing the run request and aborted - please review the error log","Errors during the process",MessageBoxButtons.OK,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1);

            }

        }

person Andrew Seabrook    schedule 26.07.2013    source источник


Ответы (1)


Не используйте цикл foreach, если вы изменяете количество элементов в коллекции.

Цикл от MAPIFolder.Items.Count до 1.

person Dmitry Streblechenko    schedule 26.07.2013