尝试从microsoft outlook 2010中提取发件人电子邮件地址并将其与字符串进行比较时出错

时间:2013-11-06 00:43:15

标签: c# outlook-2010

下面的代码有十分之九的作品,但在某些情况下,我得到以下错误: 您的服务器管理员限制了您可以同时打开的项目数。尝试关闭您打开的邮件或从正在撰写的未发送邮件中删除附件和图像。

我检查了它试图拉的电子邮件,它们都只是正常的消息。没有任何会议或类似的事情。我甚至清理了那种电子邮件。

        Microsoft.Office.Interop.Outlook.Application myApp = new Microsoft.Office.Interop.Outlook.Application();

        NameSpace mapiNameSpace = myApp.GetNamespace("MAPI");
        MAPIFolder myInbox = mapiNameSpace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

        var mail = myInbox.Items;

        foreach (object items in mail)
        {
            var item = items as MailItem;
            if (item != null)
            {

            if (!senderEmail.Equals(String.Empty) && senderName.Equals(String.Empty) && emailSubject.Equals(String.Empty))
            {
               try
                    {
                        if (((MailItem)item).SenderEmailAddress.ToLower().Contains(senderEmail.ToLower()))
                        {
                            if (count <= 40)
                            {
                                if (((MailItem)item).SenderEmailAddress.Contains(""))
                                {
                                    var senderEmailAddress = ((MailItem)item).SenderEmailAddress.Remove(((MailItem)item).SenderEmailAddress.IndexOf(""), 32);
                                    resultsGrid.Rows.Add(count, ((MailItem)item).Subject, ((MailItem)item).SenderName, senderEmailAddress, ((MailItem)item).CreationTime.ToString());
                                    resultsGrid.AutoResizeColumns();
                                }
                                else if (((MailItem)item).SenderEmailAddress.Contains(""))
                                {
                                    var senderEmailAddress = ((MailItem)item).SenderEmailAddress.Remove(((MailItem)item).SenderEmailAddress.IndexOf(""), 75);
                                    resultsGrid.Rows.Add(count, ((MailItem)item).Subject, ((MailItem)item).SenderName, senderEmailAddress, ((MailItem)item).CreationTime.ToString());
                                    resultsGrid.AutoResizeColumns();
                                }
                                else
                                {
                                    resultsGrid.Rows.Add(count, ((MailItem)item).Subject, ((MailItem)item).SenderName, ((MailItem)item).SenderEmailAddress, ((MailItem)item).CreationTime.ToString());
                                    resultsGrid.AutoResizeColumns();
                                }

                                count++;
                            }
                            else
                            {
                                resultsGrid.Rows.Add(String.Empty, "Total items in      Mailbox: " + myInbox.Items.Count, String.Empty, String.Empty, String.Empty);
                                break;
                            }
                        }
                    }
                    catch (COMException e)
                    {
                        resultsGrid.Rows.Add(e.Message);
                        resultsGrid.AutoResizeColumns();
                        break;
                    }
                    continue;
                }
     }

1 个答案:

答案 0 :(得分:0)

使用GC.Collect(),我能够强制程序清理之前的Outlook对象/调用。

我知道调用GC.Collect()不是最好的主意,但我认为它符合此处给出的标准:http://blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx

我认为问题在于,我正在生成许多请求以打开许多不同的电子邮件,垃圾收集通常随机发生,它不会发生得足够快,所以当我达到我的限制垃圾收集需要发生时。问题是在我这样做之前没有发生这种情况我需要经常调用GC.Collect()来确保我重置那些打开的对象。