Why is this iteration of an Outlook Folder only processing a maximum of half the number of items in the folder?

StackOverflow https://stackoverflow.com/questions/17888885

Pergunta

Outlook rules are putting all Facebook originating mail into a Facebook folder, an external process is running as detailed here to separate the contents of that folder in a way that was not feasible through Outlook rules process, originally I had this process running in VBA in outlook but it was a pig choking outlook resources. So I decided to throw it out externally and as I want to improve my c# skill set, this would be a conversion at the same time. Anyway the mail processing is working as it should items are going to correct sub-folders but for some reason the temporary constraint to exit after i number of iterations is not doing as it should. If there are 800 mails in the Facebook folder ( I am a member of many groups) it only runs through 400 iterations, if there are 30 it only processes 15 etc.

I cant for the life of me see why - can anyone put me right? Thanks

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

            }

        }
Foi útil?

Solução

Do not use a foreach loop it you are modifying the number of items in the collection.

Loop from MAPIFolder.Items.Count down to 1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top