Outlook加载项无法获取收件箱项目

时间:2017-02-21 16:45:27

标签: c# outlook-addin

开发用于审核收件箱中的邮件。在这个尝试用自定义类包装收件箱中的所有邮件项目。我使用以下代码来做到这一点。

OutlookNS._NameSpace outNS;
        List<MailWrapper> wrappedItems = new List<MailWrapper>();
        OutlookNS.Explorer explorer;
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            outNS = this.Application.GetNamespace("MAPI");
            OutlookNS.MAPIFolder folder = outNS.GetDefaultFolder(OutlookNS.OlDefaultFolders.olFolderInbox) as OutlookNS.MAPIFolder;

            foreach (OutlookNS.MailItem item in folder.Items)//No items here
            {
                try
                {
                    OutlookNS.MailItem mailItem = item as OutlookNS.MailItem;
                    MailWrapper wrappedItem = new MailWrapper(mailItem); ;
                    wrappedItems.Add(wrappedItem);
                }
                catch (Exception ex)
                {
                    // do nothing for now
                }
            }
        }

但这不是取物品。有人可以帮忙吗。猜测可能是因为邮件还没有加载。

2 个答案:

答案 0 :(得分:0)

首先,永远不要遍历文件夹中的所有项目 - 您将耗尽RPC通道。

最重要的是,您假设收件箱中的所有项目都是MailItem个对象。您还可以拥有MeetingItemReportItem

答案 1 :(得分:0)

无需包装文件夹中的所有项目。相反,您可以处理Explorer类的SelectionChange事件,当用户以编程方式选择其他或其他Microsoft Outlook项目或通过与用户界面交互时触发该事件。当用户(以编程方式或通过用户界面)单击或切换到包含项目的其他文件夹时,也会发生此事件,因为Outlook会自动选择该文件夹中的第一个项目。

所以基本上你可以在Outlook中选择(进入视图)时包装一个项目。您还可以找到有用的Developing an Inspector Wrapper for Outlook 2010文章。

作为一种变通方法,您可以保留EntryID的列表,该列表可用于使用命名空间类的GetItemFromID方法检索原始项目。

此外,我注意到以下代码行:

 foreach (OutlookNS.MailItem item in folder.Items)//No items here

Items集合可能包含不同类型的Outlook项目。您需要检查MessageClass属性或只检查项目类型(VBA):

 For Each Item In olFolder.Items
   If TypeOf Item Is Outlook.MailItem Then 
     Dim oMail As Outlook.MailItem: Set oMail = Item
     Debug.Print oMail.SenderEmailAddress
   End If
 Next